diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml
index 68f2aae..b7ef6a1 100644
--- a/.github/workflows/CI.yml
+++ b/.github/workflows/CI.yml
@@ -80,7 +80,7 @@ jobs:
     - run: cargo hack check --feature-powerset --no-dev-deps
 
   check-msrv:
-    # Run `cargo check` on our minimum supported Rust version (1.70.0). This
+    # Run `cargo check` on our minimum supported Rust version (1.75.0). This
     # checks with minimal versions; maximal versions are checked above.
     name: "cargo check (+MSRV -Zminimal-versions)"
     needs: check
@@ -88,7 +88,7 @@ jobs:
     strategy:
       matrix:
         toolchain:
-        - 1.70.0
+        - 1.75.0
         - stable
     steps:
     - uses: actions/checkout@v4
diff --git a/Cargo.toml b/Cargo.toml
index ccafc12..eaacf15 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "tracing-opentelemetry"
-version = "0.28.0"
+version = "0.29.0"
 description = "OpenTelemetry integration for tracing"
 homepage = "https://github.com/tokio-rs/tracing-opentelemetry"
 repository = "https://github.com/tokio-rs/tracing-opentelemetry"
@@ -13,18 +13,18 @@ categories = [
 keywords = ["tracing", "opentelemetry", "jaeger", "zipkin", "async"]
 license = "MIT"
 edition = "2021"
-rust-version = "1.70.0"
+rust-version = "1.75.0"
 
 [features]
 default = ["tracing-log", "metrics"]
 # Enables support for exporting OpenTelemetry metrics
 metrics = ["opentelemetry/metrics","opentelemetry_sdk/metrics", "smallvec"]
 # Enables experimental support for OpenTelemetry gauge metrics
-metrics_gauge_unstable = ["opentelemetry/otel_unstable"]
+metrics_gauge_unstable = []
 
 [dependencies]
-opentelemetry = { version = "0.27.0", default-features = false, features = ["trace"] }
-opentelemetry_sdk = { version = "0.27.0", default-features = false, features = ["trace"] }
+opentelemetry = { version = "0.28.0", default-features = false, features = ["trace"] }
+opentelemetry_sdk = { version = "0.28.0", default-features = false, features = ["trace"] }
 tracing = { version = "0.1.35", default-features = false, features = ["std"] }
 tracing-core = "0.1.28"
 tracing-subscriber = { version = "0.3.0", default-features = false, features = ["registry", "std"] }
@@ -43,11 +43,11 @@ smallvec = { version = "1.0", optional = true }
 [dev-dependencies]
 async-trait = "0.1.56"
 criterion = { version = "0.5.1", default-features = false, features = ["html_reports"] }
-opentelemetry = { version = "0.27.0", features = ["trace", "metrics"] }
-opentelemetry_sdk = { version = "0.27.0", default-features = false, features = ["trace", "rt-tokio"] }
-opentelemetry-stdout = { version = "0.27.0", features = ["trace", "metrics"] }
-opentelemetry-otlp = { version = "0.27.0", features = ["metrics"] }
-opentelemetry-semantic-conventions = { version = "0.27.0", features = ["semconv_experimental"] }
+opentelemetry = { version = "0.28.0", features = ["trace", "metrics"] }
+opentelemetry_sdk = { version = "0.28.0", default-features = false, features = ["trace", "rt-tokio"] }
+opentelemetry-stdout = { version = "0.28.0", features = ["trace", "metrics"] }
+opentelemetry-otlp = { version = "0.28.0", features = ["metrics", "grpc-tonic"] }
+opentelemetry-semantic-conventions = { version = "0.28.0", features = ["semconv_experimental"] }
 futures-util = { version = "0.3.17", default-features = false }
 tokio = { version = "1", features = ["full"] }
 tokio-stream = "0.1"
diff --git a/benches/trace.rs b/benches/trace.rs
index c0711f0..5fd7693 100644
--- a/benches/trace.rs
+++ b/benches/trace.rs
@@ -3,7 +3,7 @@ use opentelemetry::{
     trace::{Span, SpanBuilder, Tracer as _, TracerProvider as _},
     Context,
 };
-use opentelemetry_sdk::trace::{Tracer, TracerProvider};
+use opentelemetry_sdk::trace::{SdkTracerProvider, Tracer};
 #[cfg(not(target_os = "windows"))]
 use pprof::criterion::{Output, PProfProfiler};
 use std::time::SystemTime;
@@ -14,7 +14,7 @@ fn many_enters(c: &mut Criterion) {
     let mut group = c.benchmark_group("otel_many_enters");
 
     group.bench_function("spec_baseline", |b| {
-        let provider = TracerProvider::default();
+        let provider = SdkTracerProvider::default();
         let tracer = provider.tracer("bench");
         b.iter(|| {
             fn dummy(tracer: &Tracer, cx: &Context) {
@@ -43,7 +43,7 @@ fn many_enters(c: &mut Criterion) {
     }
 
     {
-        let provider = TracerProvider::default();
+        let provider = SdkTracerProvider::default();
         let tracer = provider.tracer("bench");
         let otel_layer = tracing_opentelemetry::layer()
             .with_tracer(tracer)
@@ -56,7 +56,7 @@ fn many_enters(c: &mut Criterion) {
     }
 
     {
-        let provider = TracerProvider::default();
+        let provider = SdkTracerProvider::default();
         let tracer = provider.tracer("bench");
         let otel_layer = tracing_opentelemetry::layer()
             .with_tracer(tracer)
@@ -73,7 +73,7 @@ fn many_children(c: &mut Criterion) {
     let mut group = c.benchmark_group("otel_many_children");
 
     group.bench_function("spec_baseline", |b| {
-        let provider = TracerProvider::default();
+        let provider = SdkTracerProvider::default();
         let tracer = provider.tracer("bench");
         b.iter(|| {
             fn dummy(tracer: &Tracer, cx: &Context) {
@@ -101,7 +101,7 @@ fn many_children(c: &mut Criterion) {
     }
 
     {
-        let provider = TracerProvider::default();
+        let provider = SdkTracerProvider::default();
         let tracer = provider.tracer("bench");
         let otel_layer = tracing_opentelemetry::layer()
             .with_tracer(tracer)
@@ -118,7 +118,7 @@ fn many_events(c: &mut Criterion) {
     let mut group = c.benchmark_group("otel_many_events");
 
     group.bench_function("spec_baseline", |b| {
-        let provider = TracerProvider::default();
+        let provider = SdkTracerProvider::default();
         let tracer = provider.tracer("bench");
         b.iter(|| {
             fn dummy(tracer: &Tracer, cx: &Context) {
@@ -147,7 +147,7 @@ fn many_events(c: &mut Criterion) {
     }
 
     {
-        let provider = TracerProvider::default();
+        let provider = SdkTracerProvider::default();
         let tracer = provider.tracer("bench");
         let otel_layer = tracing_opentelemetry::layer()
             .with_tracer(tracer)
@@ -160,7 +160,7 @@ fn many_events(c: &mut Criterion) {
     }
 
     {
-        let provider = TracerProvider::builder()
+        let provider = SdkTracerProvider::builder()
             .with_max_events_per_span(1000)
             .build();
         let tracer = provider.tracer("bench");
diff --git a/examples/basic.rs b/examples/basic.rs
index b571b29..ae56164 100644
--- a/examples/basic.rs
+++ b/examples/basic.rs
@@ -1,5 +1,5 @@
 use opentelemetry::trace::TracerProvider as _;
-use opentelemetry_sdk::trace::TracerProvider;
+use opentelemetry_sdk::trace::SdkTracerProvider;
 use opentelemetry_stdout as stdout;
 use tracing::{error, span};
 use tracing_subscriber::layer::SubscriberExt;
@@ -7,7 +7,7 @@ use tracing_subscriber::Registry;
 
 fn main() {
     // Create a new OpenTelemetry trace pipeline that prints to stdout
-    let provider = TracerProvider::builder()
+    let provider = SdkTracerProvider::builder()
         .with_simple_exporter(stdout::SpanExporter::default())
         .build();
     let tracer = provider.tracer("readme_example");
diff --git a/examples/opentelemetry-error.rs b/examples/opentelemetry-error.rs
index 37c3d3b..6f02fe8 100644
--- a/examples/opentelemetry-error.rs
+++ b/examples/opentelemetry-error.rs
@@ -8,10 +8,7 @@ use std::{
 
 use opentelemetry::global;
 use opentelemetry::trace::TracerProvider as _;
-use opentelemetry_sdk::{
-    self as sdk,
-    export::trace::{ExportResult, SpanExporter},
-};
+use opentelemetry_sdk::{self as sdk, error::OTelSdkResult, trace::SpanExporter};
 use tracing::{error, instrument, span, trace, warn};
 use tracing_subscriber::prelude::*;
 
@@ -57,11 +54,11 @@ fn double_failable_work(fail: bool) -> Result<&'static str, Error> {
 }
 
 fn main() -> Result<(), Box<dyn StdError + Send + Sync + 'static>> {
-    let builder = sdk::trace::TracerProvider::builder().with_simple_exporter(WriterExporter);
+    let builder = sdk::trace::SdkTracerProvider::builder().with_simple_exporter(WriterExporter);
     let provider = builder.build();
     let tracer = provider.tracer("opentelemetry-write-exporter");
 
-    global::set_tracer_provider(provider);
+    global::set_tracer_provider(provider.clone());
 
     let opentelemetry = tracing_opentelemetry::layer().with_tracer(tracer);
     tracing_subscriber::registry()
@@ -86,7 +83,7 @@ fn main() -> Result<(), Box<dyn StdError + Send + Sync + 'static>> {
     // Shut down the current tracer provider. This will invoke the shutdown
     // method on all span processors. span processors should export remaining
     // spans before return.
-    global::shutdown_tracer_provider();
+    provider.shutdown().unwrap();
 
     Ok(())
 }
@@ -97,19 +94,19 @@ struct WriterExporter;
 impl SpanExporter for WriterExporter {
     fn export(
         &mut self,
-        batch: Vec<sdk::export::trace::SpanData>,
-    ) -> futures_util::future::BoxFuture<'static, sdk::export::trace::ExportResult> {
+        batch: Vec<sdk::trace::SpanData>,
+    ) -> futures_util::future::BoxFuture<'static, OTelSdkResult> {
         let mut writer = std::io::stdout();
         for span in batch {
             writeln!(writer, "{}", SpanData(span)).unwrap();
         }
         writeln!(writer).unwrap();
 
-        Box::pin(async move { ExportResult::Ok(()) })
+        Box::pin(async move { OTelSdkResult::Ok(()) })
     }
 }
 
-struct SpanData(sdk::export::trace::SpanData);
+struct SpanData(sdk::trace::SpanData);
 impl Display for SpanData {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         writeln!(f, "Span: \"{}\"", self.0.name)?;
diff --git a/examples/opentelemetry-otlp.rs b/examples/opentelemetry-otlp.rs
index f04eb69..a8aa2d6 100644
--- a/examples/opentelemetry-otlp.rs
+++ b/examples/opentelemetry-otlp.rs
@@ -1,8 +1,7 @@
 use opentelemetry::{global, trace::TracerProvider as _, KeyValue};
 use opentelemetry_sdk::{
     metrics::{MeterProviderBuilder, PeriodicReader, SdkMeterProvider},
-    runtime,
-    trace::{RandomIdGenerator, Sampler, TracerProvider},
+    trace::{RandomIdGenerator, Sampler, SdkTracerProvider},
     Resource,
 };
 use opentelemetry_semantic_conventions::{
@@ -15,14 +14,16 @@ use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
 
 // Create a Resource that captures information about the entity for which telemetry is recorded.
 fn resource() -> Resource {
-    Resource::from_schema_url(
-        [
-            KeyValue::new(SERVICE_NAME, env!("CARGO_PKG_NAME")),
-            KeyValue::new(SERVICE_VERSION, env!("CARGO_PKG_VERSION")),
-            KeyValue::new(DEPLOYMENT_ENVIRONMENT_NAME, "develop"),
-        ],
-        SCHEMA_URL,
-    )
+    Resource::builder()
+        .with_schema_url(
+            [
+                KeyValue::new(SERVICE_NAME, env!("CARGO_PKG_NAME")),
+                KeyValue::new(SERVICE_VERSION, env!("CARGO_PKG_VERSION")),
+                KeyValue::new(DEPLOYMENT_ENVIRONMENT_NAME, "develop"),
+            ],
+            SCHEMA_URL,
+        )
+        .build()
 }
 
 // Construct MeterProvider for MetricsLayer
@@ -33,16 +34,13 @@ fn init_meter_provider() -> SdkMeterProvider {
         .build()
         .unwrap();
 
-    let reader = PeriodicReader::builder(exporter, runtime::Tokio)
+    let reader = PeriodicReader::builder(exporter)
         .with_interval(std::time::Duration::from_secs(30))
         .build();
 
     // For debugging in development
-    let stdout_reader = PeriodicReader::builder(
-        opentelemetry_stdout::MetricExporter::default(),
-        runtime::Tokio,
-    )
-    .build();
+    let stdout_reader =
+        PeriodicReader::builder(opentelemetry_stdout::MetricExporter::default()).build();
 
     let meter_provider = MeterProviderBuilder::default()
         .with_resource(resource())
@@ -56,13 +54,13 @@ fn init_meter_provider() -> SdkMeterProvider {
 }
 
 // Construct TracerProvider for OpenTelemetryLayer
-fn init_tracer_provider() -> TracerProvider {
+fn init_tracer_provider() -> SdkTracerProvider {
     let exporter = opentelemetry_otlp::SpanExporter::builder()
         .with_tonic()
         .build()
         .unwrap();
 
-    TracerProvider::builder()
+    SdkTracerProvider::builder()
         // Customize sampling strategy
         .with_sampler(Sampler::ParentBased(Box::new(Sampler::TraceIdRatioBased(
             1.0,
@@ -70,7 +68,7 @@ fn init_tracer_provider() -> TracerProvider {
         // If export trace to AWS X-Ray, you can use XrayIdGenerator
         .with_id_generator(RandomIdGenerator::default())
         .with_resource(resource())
-        .with_batch_exporter(exporter, runtime::Tokio)
+        .with_batch_exporter(exporter)
         .build()
 }
 
@@ -104,7 +102,7 @@ fn init_tracing_subscriber() -> OtelGuard {
 }
 
 struct OtelGuard {
-    tracer_provider: TracerProvider,
+    tracer_provider: SdkTracerProvider,
     meter_provider: SdkMeterProvider,
 }
 
diff --git a/src/layer.rs b/src/layer.rs
index 1afdade..3aeee7f 100644
--- a/src/layer.rs
+++ b/src/layer.rs
@@ -546,7 +546,7 @@ where
     ///     .build()
     ///     .unwrap();
     ///
-    /// let tracer = opentelemetry_sdk::trace::TracerProvider::builder()
+    /// let tracer = opentelemetry_sdk::trace::SdkTracerProvider::builder()
     ///     .with_simple_exporter(otlp_exporter)
     ///     .build()
     ///     .tracer("trace_demo");
@@ -598,7 +598,7 @@ where
     ///     .build()
     ///     .unwrap();
     ///
-    /// let tracer = opentelemetry_sdk::trace::TracerProvider::builder()
+    /// let tracer = opentelemetry_sdk::trace::SdkTracerProvider::builder()
     ///     .with_simple_exporter(otlp_exporter)
     ///     .build()
     ///     .tracer("trace_demo");
diff --git a/src/lib.rs b/src/lib.rs
index fb3ebb4..897fcb4 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -51,14 +51,14 @@
 //! ## Examples
 //!
 //! ```
-//! use opentelemetry_sdk::trace::TracerProvider;
+//! use opentelemetry_sdk::trace::SdkTracerProvider;
 //! use opentelemetry::trace::{Tracer, TracerProvider as _};
 //! use tracing::{error, span};
 //! use tracing_subscriber::layer::SubscriberExt;
 //! use tracing_subscriber::Registry;
 //!
 //! // Create a new OpenTelemetry trace pipeline that prints to stdout
-//! let provider = TracerProvider::builder()
+//! let provider = SdkTracerProvider::builder()
 //!     .with_simple_exporter(opentelemetry_stdout::SpanExporter::default())
 //!     .build();
 //! let tracer = provider.tracer("readme_example");
diff --git a/src/tracer.rs b/src/tracer.rs
index 0cc7678..2d666c2 100644
--- a/src/tracer.rs
+++ b/src/tracer.rs
@@ -152,11 +152,11 @@ mod tests {
     use super::*;
     use crate::OtelData;
     use opentelemetry::trace::TracerProvider as _;
-    use opentelemetry_sdk::trace::{Sampler, TracerProvider};
+    use opentelemetry_sdk::trace::{Sampler, SdkTracerProvider};
 
     #[test]
     fn assigns_default_trace_id_if_missing() {
-        let provider = TracerProvider::default();
+        let provider = SdkTracerProvider::default();
         let tracer = provider.tracer("test");
         let mut builder = SpanBuilder::from_name("empty".to_string());
         builder.span_id = Some(SpanId::from(1u64));
@@ -195,7 +195,7 @@ mod tests {
     #[test]
     fn sampled_context() {
         for (name, sampler, parent_cx, previous_sampling_result, is_sampled) in sampler_data() {
-            let provider = TracerProvider::builder().with_sampler(sampler).build();
+            let provider = SdkTracerProvider::builder().with_sampler(sampler).build();
             let tracer = provider.tracer("test");
             let mut builder = SpanBuilder::from_name("parent".to_string());
             builder.sampling_result = previous_sampling_result;
diff --git a/tests/batch_global_subscriber.rs b/tests/batch_global_subscriber.rs
index 0cc0586..109bd77 100644
--- a/tests/batch_global_subscriber.rs
+++ b/tests/batch_global_subscriber.rs
@@ -1,9 +1,8 @@
 use futures_util::future::BoxFuture;
 use opentelemetry::{global as otel_global, trace::TracerProvider as _};
 use opentelemetry_sdk::{
-    export::trace::{ExportResult, SpanData, SpanExporter},
-    runtime,
-    trace::TracerProvider,
+    error::OTelSdkResult,
+    trace::{SdkTracerProvider, SpanData, SpanExporter},
 };
 use tokio::runtime::Runtime;
 use tracing::{info_span, subscriber, Level, Subscriber};
@@ -17,7 +16,7 @@ use std::sync::{Arc, Mutex};
 struct TestExporter(Arc<Mutex<Vec<SpanData>>>);
 
 impl SpanExporter for TestExporter {
-    fn export(&mut self, mut batch: Vec<SpanData>) -> BoxFuture<'static, ExportResult> {
+    fn export(&mut self, mut batch: Vec<SpanData>) -> BoxFuture<'static, OTelSdkResult> {
         let spans = self.0.clone();
         Box::pin(async move {
             if let Ok(mut inner) = spans.lock() {
@@ -28,12 +27,12 @@ impl SpanExporter for TestExporter {
     }
 }
 
-fn test_tracer(runtime: &Runtime) -> (TracerProvider, TestExporter, impl Subscriber) {
+fn test_tracer(runtime: &Runtime) -> (SdkTracerProvider, TestExporter, impl Subscriber) {
     let _guard = runtime.enter();
 
     let exporter = TestExporter::default();
-    let provider = TracerProvider::builder()
-        .with_batch_exporter(exporter.clone(), runtime::Tokio)
+    let provider = SdkTracerProvider::builder()
+        .with_batch_exporter(exporter.clone())
         .build();
     let tracer = provider.tracer("test");
 
@@ -70,7 +69,7 @@ fn shutdown_global() {
     let rt = Runtime::new().unwrap();
     let (provider, exporter, subscriber) = test_tracer(&rt);
 
-    otel_global::set_tracer_provider(provider);
+    otel_global::set_tracer_provider(provider.clone());
     subscriber::set_global_default(subscriber).unwrap();
 
     for _ in 0..1000 {
@@ -78,7 +77,7 @@ fn shutdown_global() {
     }
 
     // Should flush all batched telemetry spans
-    otel_global::shutdown_tracer_provider();
+    provider.shutdown().unwrap();
 
     let spans = exporter.0.lock().unwrap();
     assert_eq!(spans.len(), 1000);
diff --git a/tests/errors.rs b/tests/errors.rs
index 93162fa..86c2124 100644
--- a/tests/errors.rs
+++ b/tests/errors.rs
@@ -1,9 +1,7 @@
 use futures_util::future::BoxFuture;
 use opentelemetry::trace::TracerProvider as _;
-use opentelemetry_sdk::{
-    export::trace::{ExportResult, SpanData, SpanExporter},
-    trace::{Tracer, TracerProvider},
-};
+use opentelemetry_sdk::error::OTelSdkResult;
+use opentelemetry_sdk::trace::{SdkTracerProvider, SpanData, SpanExporter, Tracer};
 use std::sync::{Arc, Mutex};
 use tracing::{instrument, Subscriber};
 use tracing_opentelemetry::layer;
@@ -85,9 +83,9 @@ fn test_tracer(
     // Uses options to capture changes of the default behavior
     error_event_exceptions: Option<bool>,
     error_event_status: Option<bool>,
-) -> (Tracer, TracerProvider, TestExporter, impl Subscriber) {
+) -> (Tracer, SdkTracerProvider, TestExporter, impl Subscriber) {
     let exporter = TestExporter::default();
-    let provider = TracerProvider::builder()
+    let provider = SdkTracerProvider::builder()
         .with_simple_exporter(exporter.clone())
         .build();
     let tracer = provider.tracer("test");
@@ -108,7 +106,7 @@ fn test_tracer(
 struct TestExporter(Arc<Mutex<Vec<SpanData>>>);
 
 impl SpanExporter for TestExporter {
-    fn export(&mut self, mut batch: Vec<SpanData>) -> BoxFuture<'static, ExportResult> {
+    fn export(&mut self, mut batch: Vec<SpanData>) -> BoxFuture<'static, OTelSdkResult> {
         let spans = self.0.clone();
         Box::pin(async move {
             if let Ok(mut inner) = spans.lock() {
diff --git a/tests/filtered.rs b/tests/filtered.rs
index 678d1a1..ce0f7d9 100644
--- a/tests/filtered.rs
+++ b/tests/filtered.rs
@@ -1,9 +1,7 @@
 use futures_util::future::BoxFuture;
 use opentelemetry::trace::TracerProvider as _;
-use opentelemetry_sdk::{
-    export::trace::{ExportResult, SpanData, SpanExporter},
-    trace::{Tracer, TracerProvider},
-};
+use opentelemetry_sdk::error::OTelSdkResult;
+use opentelemetry_sdk::trace::{SdkTracerProvider, SpanData, SpanExporter, Tracer};
 use std::sync::{Arc, Mutex};
 use tracing::level_filters::LevelFilter;
 use tracing::Subscriber;
@@ -14,7 +12,7 @@ use tracing_subscriber::prelude::*;
 struct TestExporter(Arc<Mutex<Vec<SpanData>>>);
 
 impl SpanExporter for TestExporter {
-    fn export(&mut self, mut batch: Vec<SpanData>) -> BoxFuture<'static, ExportResult> {
+    fn export(&mut self, mut batch: Vec<SpanData>) -> BoxFuture<'static, OTelSdkResult> {
         let spans = self.0.clone();
         Box::pin(async move {
             if let Ok(mut inner) = spans.lock() {
@@ -25,9 +23,9 @@ impl SpanExporter for TestExporter {
     }
 }
 
-fn test_tracer() -> (Tracer, TracerProvider, TestExporter, impl Subscriber) {
+fn test_tracer() -> (Tracer, SdkTracerProvider, TestExporter, impl Subscriber) {
     let exporter = TestExporter::default();
-    let provider = TracerProvider::builder()
+    let provider = SdkTracerProvider::builder()
         .with_simple_exporter(exporter.clone())
         .build();
     let tracer = provider.tracer("test");
diff --git a/tests/follows_from.rs b/tests/follows_from.rs
index 4240948..551837a 100644
--- a/tests/follows_from.rs
+++ b/tests/follows_from.rs
@@ -1,8 +1,8 @@
 use futures_util::future::BoxFuture;
 use opentelemetry::trace::TracerProvider as _;
 use opentelemetry_sdk::{
-    export::trace::{ExportResult, SpanData, SpanExporter},
-    trace::{Tracer, TracerProvider},
+    error::OTelSdkResult,
+    trace::{SdkTracerProvider, SpanData, SpanExporter, Tracer},
 };
 use std::sync::{Arc, Mutex};
 use tracing::Subscriber;
@@ -13,7 +13,7 @@ use tracing_subscriber::prelude::*;
 struct TestExporter(Arc<Mutex<Vec<SpanData>>>);
 
 impl SpanExporter for TestExporter {
-    fn export(&mut self, mut batch: Vec<SpanData>) -> BoxFuture<'static, ExportResult> {
+    fn export(&mut self, mut batch: Vec<SpanData>) -> BoxFuture<'static, OTelSdkResult> {
         let spans = self.0.clone();
         Box::pin(async move {
             if let Ok(mut inner) = spans.lock() {
@@ -24,9 +24,9 @@ impl SpanExporter for TestExporter {
     }
 }
 
-fn test_tracer() -> (Tracer, TracerProvider, TestExporter, impl Subscriber) {
+fn test_tracer() -> (Tracer, SdkTracerProvider, TestExporter, impl Subscriber) {
     let exporter = TestExporter::default();
-    let provider = TracerProvider::builder()
+    let provider = SdkTracerProvider::builder()
         .with_simple_exporter(exporter.clone())
         .build();
     let tracer = provider.tracer("test");
diff --git a/tests/metrics_publishing.rs b/tests/metrics_publishing.rs
index 7868b5b..496bf85 100644
--- a/tests/metrics_publishing.rs
+++ b/tests/metrics_publishing.rs
@@ -1,5 +1,6 @@
 use opentelemetry::KeyValue;
 use opentelemetry_sdk::{
+    error::OTelSdkResult,
     metrics::{
         data::{self, Gauge, Histogram, Sum},
         reader::MetricReader,
@@ -554,11 +555,11 @@ impl MetricReader for TestReader {
         self.inner.collect(rm)
     }
 
-    fn force_flush(&self) -> opentelemetry_sdk::metrics::MetricResult<()> {
+    fn force_flush(&self) -> OTelSdkResult {
         self.inner.force_flush()
     }
 
-    fn shutdown(&self) -> opentelemetry_sdk::metrics::MetricResult<()> {
+    fn shutdown(&self) -> OTelSdkResult {
         self.inner.shutdown()
     }
 
@@ -582,7 +583,7 @@ where
 {
     fn export(&self) -> Result<(), MetricError> {
         let mut rm = data::ResourceMetrics {
-            resource: Resource::default(),
+            resource: Resource::builder().build(),
             scope_metrics: Vec::new(),
         };
         self.reader.collect(&mut rm)?;
diff --git a/tests/parallel.rs b/tests/parallel.rs
index afc2d21..5a2756b 100644
--- a/tests/parallel.rs
+++ b/tests/parallel.rs
@@ -1,9 +1,7 @@
 use futures_util::future::BoxFuture;
 use opentelemetry::trace::TracerProvider as _;
-use opentelemetry_sdk::{
-    export::trace::{ExportResult, SpanData, SpanExporter},
-    trace::{SpanLimits, Tracer, TracerProvider},
-};
+use opentelemetry_sdk::error::OTelSdkResult;
+use opentelemetry_sdk::trace::{SdkTracerProvider, SpanData, SpanExporter, SpanLimits, Tracer};
 use std::sync::{Arc, Mutex};
 use tracing::level_filters::LevelFilter;
 use tracing::Subscriber;
@@ -14,7 +12,7 @@ use tracing_subscriber::prelude::*;
 struct TestExporter(Arc<Mutex<Vec<SpanData>>>);
 
 impl SpanExporter for TestExporter {
-    fn export(&mut self, mut batch: Vec<SpanData>) -> BoxFuture<'static, ExportResult> {
+    fn export(&mut self, mut batch: Vec<SpanData>) -> BoxFuture<'static, OTelSdkResult> {
         let spans = self.0.clone();
         Box::pin(async move {
             if let Ok(mut inner) = spans.lock() {
@@ -27,12 +25,12 @@ impl SpanExporter for TestExporter {
 
 fn test_tracer() -> (
     Tracer,
-    TracerProvider,
+    SdkTracerProvider,
     TestExporter,
     impl Subscriber + Clone,
 ) {
     let exporter = TestExporter::default();
-    let provider = TracerProvider::builder()
+    let provider = SdkTracerProvider::builder()
         .with_simple_exporter(exporter.clone())
         // `with_max_events_per_span()` is buggy https://github.com/open-telemetry/opentelemetry-rust/pull/2405
         .with_span_limits(SpanLimits {
diff --git a/tests/parents.rs b/tests/parents.rs
index 2934d20..8fda109 100644
--- a/tests/parents.rs
+++ b/tests/parents.rs
@@ -1,9 +1,7 @@
 use futures_util::future::BoxFuture;
 use opentelemetry::trace::TracerProvider as _;
-use opentelemetry_sdk::{
-    export::trace::{ExportResult, SpanData, SpanExporter},
-    trace::{Tracer, TracerProvider},
-};
+use opentelemetry_sdk::error::OTelSdkResult;
+use opentelemetry_sdk::trace::{SdkTracerProvider, SpanData, SpanExporter, Tracer};
 use std::sync::{Arc, Mutex};
 use tracing::level_filters::LevelFilter;
 use tracing::Subscriber;
@@ -14,7 +12,7 @@ use tracing_subscriber::prelude::*;
 struct TestExporter(Arc<Mutex<Vec<SpanData>>>);
 
 impl SpanExporter for TestExporter {
-    fn export(&mut self, mut batch: Vec<SpanData>) -> BoxFuture<'static, ExportResult> {
+    fn export(&mut self, mut batch: Vec<SpanData>) -> BoxFuture<'static, OTelSdkResult> {
         let spans = self.0.clone();
         Box::pin(async move {
             if let Ok(mut inner) = spans.lock() {
@@ -25,9 +23,9 @@ impl SpanExporter for TestExporter {
     }
 }
 
-fn test_tracer() -> (Tracer, TracerProvider, TestExporter, impl Subscriber) {
+fn test_tracer() -> (Tracer, SdkTracerProvider, TestExporter, impl Subscriber) {
     let exporter = TestExporter::default();
-    let provider = TracerProvider::builder()
+    let provider = SdkTracerProvider::builder()
         .with_simple_exporter(exporter.clone())
         .build();
     let tracer = provider.tracer("test");
diff --git a/tests/span_ext.rs b/tests/span_ext.rs
index acfdcdf..cdb9129 100644
--- a/tests/span_ext.rs
+++ b/tests/span_ext.rs
@@ -1,8 +1,8 @@
 use futures_util::future::BoxFuture;
 use opentelemetry::trace::{Status, TracerProvider as _};
 use opentelemetry_sdk::{
-    export::trace::{ExportResult, SpanData, SpanExporter},
-    trace::{Tracer, TracerProvider},
+    error::OTelSdkResult,
+    trace::{SdkTracerProvider, SpanData, SpanExporter, Tracer},
 };
 use std::sync::{Arc, Mutex};
 use tracing::level_filters::LevelFilter;
@@ -14,7 +14,7 @@ use tracing_subscriber::prelude::*;
 struct TestExporter(Arc<Mutex<Vec<SpanData>>>);
 
 impl SpanExporter for TestExporter {
-    fn export(&mut self, mut batch: Vec<SpanData>) -> BoxFuture<'static, ExportResult> {
+    fn export(&mut self, mut batch: Vec<SpanData>) -> BoxFuture<'static, OTelSdkResult> {
         let spans = self.0.clone();
         Box::pin(async move {
             if let Ok(mut inner) = spans.lock() {
@@ -25,9 +25,9 @@ impl SpanExporter for TestExporter {
     }
 }
 
-fn test_tracer() -> (Tracer, TracerProvider, TestExporter, impl Subscriber) {
+fn test_tracer() -> (Tracer, SdkTracerProvider, TestExporter, impl Subscriber) {
     let exporter = TestExporter::default();
-    let provider = TracerProvider::builder()
+    let provider = SdkTracerProvider::builder()
         .with_simple_exporter(exporter.clone())
         .build();
     let tracer = provider.tracer("test");
diff --git a/tests/trace_state_propagation.rs b/tests/trace_state_propagation.rs
index c4cf067..91a804f 100644
--- a/tests/trace_state_propagation.rs
+++ b/tests/trace_state_propagation.rs
@@ -5,9 +5,9 @@ use opentelemetry::{
     Context,
 };
 use opentelemetry_sdk::{
-    export::trace::{ExportResult, SpanData, SpanExporter},
+    error::OTelSdkResult,
     propagation::{BaggagePropagator, TraceContextPropagator},
-    trace::{Sampler, Tracer, TracerProvider},
+    trace::{Sampler, SdkTracerProvider, SpanData, SpanExporter, Tracer},
 };
 use std::collections::{HashMap, HashSet};
 use std::sync::{Arc, Mutex};
@@ -105,7 +105,7 @@ fn inject_context_into_outgoing_requests() {
 fn sampling_decision_respects_new_parent() {
     // custom setup required due to ParentBased(AlwaysOff) sampler
     let exporter = TestExporter::default();
-    let provider = TracerProvider::builder()
+    let provider = SdkTracerProvider::builder()
         .with_simple_exporter(exporter.clone())
         .with_sampler(Sampler::ParentBased(Box::new(Sampler::AlwaysOff)))
         .build();
@@ -169,9 +169,9 @@ fn assert_carrier_attrs_eq(
     assert_eq!(carrier_a.get("tracestate"), carrier_b.get("tracestate"));
 }
 
-fn test_tracer() -> (Tracer, TracerProvider, TestExporter, impl Subscriber) {
+fn test_tracer() -> (Tracer, SdkTracerProvider, TestExporter, impl Subscriber) {
     let exporter = TestExporter::default();
-    let provider = TracerProvider::builder()
+    let provider = SdkTracerProvider::builder()
         .with_simple_exporter(exporter.clone())
         .build();
     let tracer = provider.tracer("test");
@@ -206,7 +206,7 @@ fn test_carrier() -> HashMap<String, String> {
     carrier
 }
 
-fn build_sampled_context() -> (Context, impl Subscriber, TestExporter, TracerProvider) {
+fn build_sampled_context() -> (Context, impl Subscriber, TestExporter, SdkTracerProvider) {
     let (tracer, provider, exporter, subscriber) = test_tracer();
     let span = tracer.start("sampled");
     let cx = Context::current_with_span(span);
@@ -218,7 +218,7 @@ fn build_sampled_context() -> (Context, impl Subscriber, TestExporter, TracerPro
 struct TestExporter(Arc<Mutex<Vec<SpanData>>>);
 
 impl SpanExporter for TestExporter {
-    fn export(&mut self, mut batch: Vec<SpanData>) -> BoxFuture<'static, ExportResult> {
+    fn export(&mut self, mut batch: Vec<SpanData>) -> BoxFuture<'static, OTelSdkResult> {
         let spans = self.0.clone();
         Box::pin(async move {
             if let Ok(mut inner) = spans.lock() {