diff --git a/src/core/lib/support/memory.h b/src/core/lib/support/memory.h
index 3e00fb2011d..bd56ca39394 100644
--- a/src/core/lib/support/memory.h
+++ b/src/core/lib/support/memory.h
@@ -61,8 +61,8 @@ class DefaultDelete {
   void operator()(T* p) { Delete(p); }
 };
 
-template <typename T>
-using UniquePtr = std::unique_ptr<T, DefaultDelete<T>>;
+template <typename T, typename Deleter = DefaultDelete<T>>
+using UniquePtr = std::unique_ptr<T, Deleter>;
 
 template <typename T, typename... Args>
 inline UniquePtr<T> MakeUnique(Args&&... args) {
diff --git a/test/core/support/memory_test.cc b/test/core/support/memory_test.cc
index 9e20e48b0cc..8db316a4238 100644
--- a/test/core/support/memory_test.cc
+++ b/test/core/support/memory_test.cc
@@ -66,6 +66,19 @@ TEST(MemoryTest, MakeUniqueWithArgTest) {
   EXPECT_EQ(42, *i);
 }
 
+TEST(MemoryTest, UniquePtrWithCustomDeleter) {
+  int n = 0;
+  class IncrementingDeleter {
+   public:
+    void operator()(int* p) { ++*p; }
+  };
+  {
+    UniquePtr<int, IncrementingDeleter> p(&n);
+    EXPECT_EQ(0, n);
+  }
+  EXPECT_EQ(1, n);
+}
+
 }  // namespace testing
 }  // namespace grpc_core