diff --git a/src/core/ext/filters/http/message_compress/message_compress_filter.cc b/src/core/ext/filters/http/message_compress/message_compress_filter.cc
index 436aa87ec8e..6cf2dcf522e 100644
--- a/src/core/ext/filters/http/message_compress/message_compress_filter.cc
+++ b/src/core/ext/filters/http/message_compress/message_compress_filter.cc
@@ -104,7 +104,7 @@ class CallData {
                       ForwardSendMessageBatch, elem, grpc_schedule_on_exec_ctx);
   }
 
-  ~CallData() { GRPC_ERROR_UNREF(cancel_error_); }
+  ~CallData() {}
 
   void CompressStartTransportStreamOpBatch(
       grpc_call_element* elem, grpc_transport_stream_op_batch* batch);
diff --git a/src/core/ext/filters/message_size/message_size_filter.cc b/src/core/ext/filters/message_size/message_size_filter.cc
index cf4817e86c6..c11da83934f 100644
--- a/src/core/ext/filters/message_size/message_size_filter.cc
+++ b/src/core/ext/filters/message_size/message_size_filter.cc
@@ -185,7 +185,7 @@ struct call_data {
     }
   }
 
-  ~call_data() { GRPC_ERROR_UNREF(error); }
+  ~call_data() {}
 
   grpc_core::CallCombiner* call_combiner;
   grpc_core::MessageSizeParsedConfig::message_size_limits limits;
diff --git a/src/core/lib/channel/connected_channel.cc b/src/core/lib/channel/connected_channel.cc
index ed77e8cdcc4..10e3c95517a 100644
--- a/src/core/lib/channel/connected_channel.cc
+++ b/src/core/lib/channel/connected_channel.cc
@@ -289,7 +289,7 @@ class ClientStream : public Orphanable {
       auto* stream = stream_.get();
       cancel_op->on_complete = NewClosure(
           [this](grpc_error_handle) { Unref("shutdown client stream"); });
-      batch_payload_.cancel_stream.cancel_error = GRPC_ERROR_CANCELLED;
+      batch_payload_.cancel_stream.cancel_error = absl::CancelledError();
       grpc_transport_perform_stream_op(transport_, stream, cancel_op);
     }
     Unref("orphan client stream");
@@ -521,7 +521,7 @@ class ClientStream : public Orphanable {
   }
 
   void RecvInitialMetadataReady(grpc_error_handle error) {
-    GPR_ASSERT(error == GRPC_ERROR_NONE);
+    GPR_ASSERT(error == absl::OkStatus());
     {
       MutexLock lock(&mu_);
       server_initial_metadata_state_ =
@@ -532,7 +532,7 @@ class ClientStream : public Orphanable {
   }
 
   void RecvTrailingMetadataReady(grpc_error_handle error) {
-    GPR_ASSERT(error == GRPC_ERROR_NONE);
+    GPR_ASSERT(error == absl::OkStatus());
     {
       MutexLock lock(&mu_);
       queued_trailing_metadata_ = true;
@@ -542,14 +542,14 @@ class ClientStream : public Orphanable {
   }
 
   void MetadataBatchDone(grpc_error_handle error) {
-    GPR_ASSERT(error == GRPC_ERROR_NONE);
+    GPR_ASSERT(error == absl::OkStatus());
     Unref("metadata_batch_done");
   }
 
   void SendMessageBatchDone(grpc_error_handle error) {
     {
       MutexLock lock(&mu_);
-      if (error != GRPC_ERROR_NONE) {
+      if (error != absl::OkStatus()) {
         // Note that we're in error here, the call will be closed by the
         // transport in a moment, and we'll return from the promise with an
         // error - so we don't need to do any extra work to close out pipes or
@@ -567,7 +567,7 @@ class ClientStream : public Orphanable {
   void RecvMessageBatchDone(grpc_error_handle error) {
     {
       MutexLock lock(&mu_);
-      if (error != GRPC_ERROR_NONE) {
+      if (error != absl::OkStatus()) {
         if (grpc_call_trace.enabled()) {
           gpr_log(GPR_INFO, "%sRecvMessageBatchDone: error=%s",
                   recv_message_waker_.ActivityDebugTag().c_str(),
@@ -597,7 +597,7 @@ class ClientStream : public Orphanable {
         grpc_transport_perform_stream_op(transport_, stream_.get(), batch);
       } else {
         grpc_transport_stream_op_batch_finish_with_failure_from_transport(
-            batch, GRPC_ERROR_CANCELLED);
+            batch, absl::CancelledError());
       }
     };
     bool push_metadata;
@@ -657,7 +657,7 @@ class ClientStream : public Orphanable {
   void SchedulePush() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
     if (std::exchange(scheduled_push_, true)) return;
     IncrementRefCount("push");
-    ExecCtx::Run(DEBUG_LOCATION, &push_, GRPC_ERROR_NONE);
+    ExecCtx::Run(DEBUG_LOCATION, &push_, absl::OkStatus());
   }
 
   std::string ActiveOpsString() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
diff --git a/src/core/lib/iomgr/error.h b/src/core/lib/iomgr/error.h
index 8d01d159b74..7d4df221cc7 100644
--- a/src/core/lib/iomgr/error.h
+++ b/src/core/lib/iomgr/error.h
@@ -258,12 +258,8 @@ inline bool grpc_log_if_error(const char* what, grpc_error_handle error,
 /// This could be considered as atomic<grpc_error_handle>.
 class AtomicError {
  public:
-  AtomicError() {
-    error_ = absl::OkStatus();
-    lock_ = GPR_SPINLOCK_STATIC_INITIALIZER;
-  }
+  AtomicError() = default;
   explicit AtomicError(grpc_error_handle error) { error_ = error; }
-  ~AtomicError() { GRPC_ERROR_UNREF(error_); }
 
   AtomicError(const AtomicError&) = delete;
   AtomicError& operator=(const AtomicError&) = delete;
@@ -291,7 +287,7 @@ class AtomicError {
 
  private:
   grpc_error_handle error_;
-  gpr_spinlock lock_;
+  gpr_spinlock lock_ = GPR_SPINLOCK_STATIC_INITIALIZER;
 };
 
 #endif /* GRPC_CORE_LIB_IOMGR_ERROR_H */
diff --git a/src/core/lib/security/transport/security_handshaker.cc b/src/core/lib/security/transport/security_handshaker.cc
index 83c485f9720..2a23409fb3a 100644
--- a/src/core/lib/security/transport/security_handshaker.cc
+++ b/src/core/lib/security/transport/security_handshaker.cc
@@ -581,7 +581,7 @@ void SecurityHandshaker::DoHandshake(grpc_tcp_server_acceptor* /*acceptor*/,
 class FailHandshaker : public Handshaker {
  public:
   const char* name() const override { return "security_fail"; }
-  void Shutdown(grpc_error_handle why) override { GRPC_ERROR_UNREF(why); }
+  void Shutdown(grpc_error_handle /*why*/) override {}
   void DoHandshake(grpc_tcp_server_acceptor* /*acceptor*/,
                    grpc_closure* on_handshake_done,
                    HandshakerArgs* args) override {
diff --git a/src/core/lib/security/transport/server_auth_filter.cc b/src/core/lib/security/transport/server_auth_filter.cc
index 8ca589f053b..0461f622b7c 100644
--- a/src/core/lib/security/transport/server_auth_filter.cc
+++ b/src/core/lib/security/transport/server_auth_filter.cc
@@ -96,7 +96,7 @@ struct call_data {
         grpc_server_security_context_destroy;
   }
 
-  ~call_data() { GRPC_ERROR_UNREF(recv_initial_metadata_error); }
+  ~call_data() {}
 
   grpc_core::CallCombiner* call_combiner;
   grpc_call_stack* owning_call;
diff --git a/src/core/lib/surface/call.cc b/src/core/lib/surface/call.cc
index f20d2c6a1b3..fec285ed476 100644
--- a/src/core/lib/surface/call.cc
+++ b/src/core/lib/surface/call.cc
@@ -324,7 +324,7 @@ void Call::PropagateCancellationToChildren() {
         Call* next_child_call = child->child_->sibling_next;
         if (child->cancellation_is_inherited_) {
           child->InternalRef("propagate_cancel");
-          child->CancelWithError(GRPC_ERROR_CANCELLED);
+          child->CancelWithError(absl::CancelledError());
           child->InternalUnref("propagate_cancel");
         }
         child = next_child_call;
@@ -1331,14 +1331,14 @@ void EndOpImmediately(grpc_completion_queue* cq, void* notify_tag,
   if (!is_notify_tag_closure) {
     GPR_ASSERT(grpc_cq_begin_op(cq, notify_tag));
     grpc_cq_end_op(
-        cq, notify_tag, GRPC_ERROR_NONE,
+        cq, notify_tag, absl::OkStatus(),
         [](void*, grpc_cq_completion* completion) { gpr_free(completion); },
         nullptr,
         static_cast<grpc_cq_completion*>(
             gpr_malloc(sizeof(grpc_cq_completion))));
   } else {
     Closure::Run(DEBUG_LOCATION, static_cast<grpc_closure*>(notify_tag),
-                 GRPC_ERROR_NONE);
+                 absl::OkStatus());
   }
 }
 }  // namespace
@@ -2195,7 +2195,7 @@ grpc_error_handle MakePromiseBasedCall(grpc_call_create_args* args,
   PromiseBasedCall* call = new (alloc.second) T(alloc.first, args);
   *out_call = call->c_ptr();
   GPR_DEBUG_ASSERT(Call::FromC(*out_call) == call);
-  return GRPC_ERROR_NONE;
+  return absl::OkStatus();
 }
 
 PromiseBasedCall::PromiseBasedCall(Arena* arena,
@@ -2319,7 +2319,7 @@ void PromiseBasedCall::FinishOpOnCompletion(Completion* completion,
   CompletionInfo::Pending& pending = completion_info_[i].pending;
   GPR_ASSERT(pending.pending_op_bits & PendingOpBit(reason));
   pending.pending_op_bits &= ~PendingOpBit(reason);
-  auto error = pending.success ? GRPC_ERROR_NONE : GRPC_ERROR_CANCELLED;
+  auto error = pending.success ? absl::OkStatus() : absl::CancelledError();
   if (pending.pending_op_bits == 0) {
     if (pending.is_closure) {
       ExecCtx::Run(DEBUG_LOCATION, static_cast<grpc_closure*>(pending.tag),
@@ -2486,7 +2486,6 @@ void ClientPromiseBasedCall::CancelWithError(grpc_error_handle error) {
   MutexLock lock(mu());
   ScopedContext context(this);
   Finish(ServerMetadataHandle(grpc_error_to_absl_status(error)));
-  GRPC_ERROR_UNREF(error);
 }
 
 grpc_call_error ClientPromiseBasedCall::ValidateBatch(const grpc_op* ops,
diff --git a/src/core/lib/transport/transport.cc b/src/core/lib/transport/transport.cc
index e2670095168..84e49708b1d 100644
--- a/src/core/lib/transport/transport.cc
+++ b/src/core/lib/transport/transport.cc
@@ -188,31 +188,27 @@ void grpc_transport_stream_op_batch_queue_finish_with_failure(
 void grpc_transport_stream_op_batch_finish_with_failure_from_transport(
     grpc_transport_stream_op_batch* batch, grpc_error_handle error) {
   if (batch->cancel_stream) {
-    GRPC_ERROR_UNREF(batch->payload->cancel_stream.cancel_error);
   }
   // Construct a list of closures to execute.
   if (batch->recv_initial_metadata) {
     grpc_core::ExecCtx::Run(
         DEBUG_LOCATION,
         batch->payload->recv_initial_metadata.recv_initial_metadata_ready,
-        GRPC_ERROR_REF(error));
+        error);
   }
   if (batch->recv_message) {
-    grpc_core::ExecCtx::Run(DEBUG_LOCATION,
-                            batch->payload->recv_message.recv_message_ready,
-                            GRPC_ERROR_REF(error));
+    grpc_core::ExecCtx::Run(
+        DEBUG_LOCATION, batch->payload->recv_message.recv_message_ready, error);
   }
   if (batch->recv_trailing_metadata) {
     grpc_core::ExecCtx::Run(
         DEBUG_LOCATION,
         batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready,
-        GRPC_ERROR_REF(error));
+        error);
   }
   if (batch->on_complete != nullptr) {
-    grpc_core::ExecCtx::Run(DEBUG_LOCATION, batch->on_complete,
-                            GRPC_ERROR_REF(error));
+    grpc_core::ExecCtx::Run(DEBUG_LOCATION, batch->on_complete, error);
   }
-  GRPC_ERROR_UNREF(error);
 }
 
 struct made_transport_op {
diff --git a/src/cpp/ext/filters/census/client_filter.cc b/src/cpp/ext/filters/census/client_filter.cc
index 5bde83d3b53..dba2724cf57 100644
--- a/src/cpp/ext/filters/census/client_filter.cc
+++ b/src/cpp/ext/filters/census/client_filter.cc
@@ -74,7 +74,7 @@ grpc_error_handle CensusClientChannelData::Init(
   tracing_enabled_ = grpc_core::ChannelArgs::FromC(args->channel_args)
                          .GetInt(GRPC_ARG_ENABLE_OBSERVABILITY)
                          .value_or(true);
-  return GRPC_ERROR_NONE;
+  return absl::OkStatus();
 }
 
 //
diff --git a/test/core/end2end/fixtures/h2_sockpair_with_minstack.cc b/test/core/end2end/fixtures/h2_sockpair_with_minstack.cc
index d200338eb82..0de61c3ed4e 100644
--- a/test/core/end2end/fixtures/h2_sockpair_with_minstack.cc
+++ b/test/core/end2end/fixtures/h2_sockpair_with_minstack.cc
@@ -63,10 +63,9 @@ static void server_setup_transport(void* ts, grpc_transport* transport) {
   grpc_core::Server* core_server = grpc_core::Server::FromC(f->server);
   grpc_error_handle error = core_server->SetupTransport(
       transport, nullptr, core_server->channel_args(), nullptr);
-  if (error == GRPC_ERROR_NONE) {
+  if (error == absl::OkStatus()) {
     grpc_chttp2_transport_start_reading(transport, nullptr, nullptr, nullptr);
   } else {
-    GRPC_ERROR_UNREF(error);
     grpc_transport_destroy(transport);
   }
 }
diff --git a/test/core/http/request_fuzzer.cc b/test/core/http/request_fuzzer.cc
index 1d8cec262b5..079c516b4c1 100644
--- a/test/core/http/request_fuzzer.cc
+++ b/test/core/http/request_fuzzer.cc
@@ -23,7 +23,6 @@
 #include <grpc/slice.h>
 
 #include "src/core/lib/http/parser.h"
-#include "src/core/lib/iomgr/error.h"
 
 bool squelch = true;
 bool leak_check = true;
@@ -35,8 +34,8 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   memset(&request, 0, sizeof(request));
   grpc_http_parser_init(&parser, GRPC_HTTP_REQUEST, &request);
   grpc_slice slice = grpc_slice_from_copied_buffer((const char*)data, size);
-  GRPC_ERROR_UNREF(grpc_http_parser_parse(&parser, slice, nullptr));
-  GRPC_ERROR_UNREF(grpc_http_parser_eof(&parser));
+  (void)grpc_http_parser_parse(&parser, slice, nullptr);
+  (void)grpc_http_parser_eof(&parser);
   grpc_slice_unref(slice);
   grpc_http_parser_destroy(&parser);
   grpc_http_request_destroy(&request);
diff --git a/test/core/http/response_fuzzer.cc b/test/core/http/response_fuzzer.cc
index 1f0b36ff481..ee5a6efd398 100644
--- a/test/core/http/response_fuzzer.cc
+++ b/test/core/http/response_fuzzer.cc
@@ -23,7 +23,6 @@
 #include <grpc/slice.h>
 
 #include "src/core/lib/http/parser.h"
-#include "src/core/lib/iomgr/error.h"
 
 bool squelch = true;
 bool leak_check = true;
@@ -35,8 +34,8 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   response = {};
   grpc_http_parser_init(&parser, GRPC_HTTP_RESPONSE, &response);
   grpc_slice slice = grpc_slice_from_copied_buffer((const char*)data, size);
-  GRPC_ERROR_UNREF(grpc_http_parser_parse(&parser, slice, nullptr));
-  GRPC_ERROR_UNREF(grpc_http_parser_eof(&parser));
+  (void)grpc_http_parser_parse(&parser, slice, nullptr);
+  (void)grpc_http_parser_eof(&parser);
   grpc_slice_unref(slice);
   grpc_http_parser_destroy(&parser);
   grpc_http_response_destroy(&response);
diff --git a/test/core/transport/chttp2/hpack_parser_fuzzer_test.cc b/test/core/transport/chttp2/hpack_parser_fuzzer_test.cc
index 5c8f132f55f..227ebb49921 100644
--- a/test/core/transport/chttp2/hpack_parser_fuzzer_test.cc
+++ b/test/core/transport/chttp2/hpack_parser_fuzzer_test.cc
@@ -26,7 +26,6 @@
 
 #include "src/core/ext/transport/chttp2/transport/hpack_parser.h"
 #include "src/core/lib/gprpp/ref_counted_ptr.h"
-#include "src/core/lib/iomgr/error.h"
 #include "src/core/lib/iomgr/exec_ctx.h"
 #include "src/core/lib/resource_quota/arena.h"
 #include "src/core/lib/resource_quota/memory_quota.h"
@@ -85,7 +84,7 @@ DEFINE_PROTO_FUZZER(const hpack_parser_fuzzer::Msg& msg) {
       for (const auto& parse : frame.parse()) {
         grpc_slice buffer =
             grpc_slice_from_copied_buffer(parse.data(), parse.size());
-        GRPC_ERROR_UNREF(parser->Parse(buffer, i == msg.frames_size() - 1));
+        (void)parser->Parse(buffer, i == msg.frames_size() - 1);
         grpc_slice_unref(buffer);
         stop_buffering_ctr--;
         if (0 == stop_buffering_ctr) parser->StopBufferingFrame();
diff --git a/test/core/transport/chttp2/settings_timeout_test.cc b/test/core/transport/chttp2/settings_timeout_test.cc
index 141280e0f3c..de558f7be5f 100644
--- a/test/core/transport/chttp2/settings_timeout_test.cc
+++ b/test/core/transport/chttp2/settings_timeout_test.cc
@@ -196,7 +196,7 @@ class Client {
                         grpc_schedule_on_exec_ctx);
     }
 
-    ~EventState() { GRPC_ERROR_UNREF(error_); }
+    ~EventState() {}
 
     grpc_closure* closure() { return &closure_; }
 
diff --git a/test/cpp/microbenchmarks/bm_call_create.cc b/test/cpp/microbenchmarks/bm_call_create.cc
index 64e4960315c..ea399043534 100644
--- a/test/cpp/microbenchmarks/bm_call_create.cc
+++ b/test/cpp/microbenchmarks/bm_call_create.cc
@@ -561,8 +561,8 @@ static void BM_IsolatedFilter(benchmark::State& state) {
       grpc_core::Arena::Create(kArenaSize, g_memory_allocator),
       nullptr};
   while (state.KeepRunning()) {
-    GRPC_ERROR_UNREF(
-        grpc_call_stack_init(channel_stack, 1, DoNothing, nullptr, &call_args));
+    (void)grpc_call_stack_init(channel_stack, 1, DoNothing, nullptr,
+                               &call_args);
     typename TestOp::Op op(&test_op_data, call_stack, call_args.arena);
     grpc_call_stack_destroy(call_stack, &final_info, nullptr);
     op.Finish();
diff --git a/test/cpp/microbenchmarks/bm_exec_ctx.cc b/test/cpp/microbenchmarks/bm_exec_ctx.cc
index da707c0dabe..8ebad7bf5d9 100644
--- a/test/cpp/microbenchmarks/bm_exec_ctx.cc
+++ b/test/cpp/microbenchmarks/bm_exec_ctx.cc
@@ -34,7 +34,7 @@ void BM_ExecCtx_Run(benchmark::State& state) {
   grpc_core::ExecCtx exec_ctx;
   for (auto _ : state) {
     for (int i = 0; i < cb_count; i++) {
-      exec_ctx.Run(DEBUG_LOCATION, &cb, GRPC_ERROR_NONE);
+      exec_ctx.Run(DEBUG_LOCATION, &cb, absl::OkStatus());
       exec_ctx.Flush();
     }
   }
@@ -68,7 +68,7 @@ void BM_ExecCtx_RunCounted(benchmark::State& state) {
   grpc_core::ExecCtx exec_ctx;
   for (auto _ : state) {
     for (int i = 0; i < cb_count; i++) {
-      exec_ctx.Run(DEBUG_LOCATION, &cb, GRPC_ERROR_NONE);
+      exec_ctx.Run(DEBUG_LOCATION, &cb, absl::OkStatus());
       exec_ctx.Flush();
     }
     data.signal->WaitForNotification();
diff --git a/test/cpp/microbenchmarks/bm_pollset.cc b/test/cpp/microbenchmarks/bm_pollset.cc
index c6dcf70cd11..f445be89ecc 100644
--- a/test/cpp/microbenchmarks/bm_pollset.cc
+++ b/test/cpp/microbenchmarks/bm_pollset.cc
@@ -118,8 +118,7 @@ static void BM_PollEmptyPollset(benchmark::State& state) {
   grpc_core::ExecCtx exec_ctx;
   gpr_mu_lock(mu);
   for (auto _ : state) {
-    GRPC_ERROR_UNREF(
-        grpc_pollset_work(ps, nullptr, grpc_core::Timestamp::ProcessEpoch()));
+    (void)grpc_pollset_work(ps, nullptr, grpc_core::Timestamp::ProcessEpoch());
   }
   grpc_closure shutdown_ps_closure;
   GRPC_CLOSURE_INIT(&shutdown_ps_closure, shutdown_ps, ps,
@@ -220,25 +219,24 @@ static void BM_SingleThreadPollOneFd(benchmark::State& state) {
   grpc_pollset_init(ps, &mu);
   grpc_core::ExecCtx exec_ctx;
   grpc_wakeup_fd wakeup_fd;
-  GRPC_ERROR_UNREF(grpc_wakeup_fd_init(&wakeup_fd));
+  (void)grpc_wakeup_fd_init(&wakeup_fd);
   grpc_fd* wakeup = grpc_fd_create(wakeup_fd.read_fd, "wakeup_read", false);
   grpc_pollset_add_fd(ps, wakeup);
   bool done = false;
   TestClosure* continue_closure = MakeTestClosure([&]() {
-    GRPC_ERROR_UNREF(grpc_wakeup_fd_consume_wakeup(&wakeup_fd));
+    (void)grpc_wakeup_fd_consume_wakeup(&wakeup_fd);
     if (!state.KeepRunning()) {
       done = true;
       return;
     }
-    GRPC_ERROR_UNREF(grpc_wakeup_fd_wakeup(&wakeup_fd));
+    (void)grpc_wakeup_fd_wakeup(&wakeup_fd);
     grpc_fd_notify_on_read(wakeup, continue_closure);
   });
-  GRPC_ERROR_UNREF(grpc_wakeup_fd_wakeup(&wakeup_fd));
+  (void)grpc_wakeup_fd_wakeup(&wakeup_fd);
   grpc_fd_notify_on_read(wakeup, continue_closure);
   gpr_mu_lock(mu);
   while (!done) {
-    GRPC_ERROR_UNREF(
-        grpc_pollset_work(ps, nullptr, grpc_core::Timestamp::InfFuture()));
+    (void)grpc_pollset_work(ps, nullptr, grpc_core::Timestamp::InfFuture());
   }
   grpc_fd_orphan(wakeup, nullptr, nullptr, "done");
   wakeup_fd.read_fd = 0;