diff --git a/benchmarks/benchmark.cc b/benchmarks/benchmark.cc
index 174b0e3..e752d3e 100644
--- a/benchmarks/benchmark.cc
+++ b/benchmarks/benchmark.cc
@@ -136,15 +136,15 @@
 static void BM_LoadAdsDescriptor_Upb(benchmark::State& state) {
   size_t bytes_per_iter = 0;
   for (auto _ : state) {
-    upb::SymbolTable symtab;
+    upb::DefPool defpool;
     if (Mode == NoLayout) {
       google_ads_googleads_v11_services_SearchGoogleAdsRequest_getmsgdef(
-          symtab.ptr());
-      bytes_per_iter = _upb_DefPool_BytesLoaded(symtab.ptr());
+          defpool.ptr());
+      bytes_per_iter = _upb_DefPool_BytesLoaded(defpool.ptr());
     } else {
       bytes_per_iter = 0;
       LoadDefInit_BuildLayout(
-          symtab.ptr(),
+          defpool.ptr(),
           &google_ads_googleads_v11_services_google_ads_service_proto_upbdefinit,
           &bytes_per_iter);
     }
diff --git a/upb/bindings/lua/def.c b/upb/bindings/lua/def.c
index 1321167..602dbaf 100644
--- a/upb/bindings/lua/def.c
+++ b/upb/bindings/lua/def.c
@@ -42,7 +42,7 @@
 #define LUPB_FILEDEF "lupb.filedef"
 #define LUPB_MSGDEF "lupb.msgdef"
 #define LUPB_ONEOFDEF "lupb.oneof"
-#define LUPB_SYMTAB "lupb.symtab"
+#define LUPB_SYMTAB "lupb.defpool"
 #define LUPB_OBJCACHE "lupb.objcache"
 
 static void lupb_DefPool_pushwrapper(lua_State* L, int narg, const void* def,
@@ -51,7 +51,7 @@
 /* lupb_wrapper ***************************************************************/
 
 /* Wrappers around upb def objects.  The userval contains a reference to the
- * symtab. */
+ * defpool. */
 
 #define LUPB_SYMTAB_INDEX 1
 
@@ -65,19 +65,19 @@
   return w->def;
 }
 
-static void lupb_wrapper_pushsymtab(lua_State* L, int narg) {
+static void lupb_wrapper_pushdefpool(lua_State* L, int narg) {
   lua_getiuservalue(L, narg, LUPB_SYMTAB_INDEX);
 }
 
 /* lupb_wrapper_pushwrapper()
  *
  * For a given def wrapper at index |narg|, pushes a wrapper for the given |def|
- * and the given |type|.  The new wrapper will be part of the same symtab. */
+ * and the given |type|.  The new wrapper will be part of the same defpool. */
 static void lupb_wrapper_pushwrapper(lua_State* L, int narg, const void* def,
                                      const char* type) {
-  lupb_wrapper_pushsymtab(L, narg);
+  lupb_wrapper_pushdefpool(L, narg);
   lupb_DefPool_pushwrapper(L, -1, def, type);
-  lua_replace(L, -2); /* Remove symtab from stack. */
+  lua_replace(L, -2); /* Remove defpool from stack. */
 }
 
 /* lupb_MessageDef_pushsubmsgdef()
@@ -337,8 +337,8 @@
 
 static bool lupb_MessageDef_pushnested(lua_State* L, int msgdef, int name) {
   const upb_MessageDef* m = lupb_MessageDef_check(L, msgdef);
-  lupb_wrapper_pushsymtab(L, msgdef);
-  upb_DefPool* symtab = lupb_DefPool_check(L, -1);
+  lupb_wrapper_pushdefpool(L, msgdef);
+  upb_DefPool* defpool = lupb_DefPool_check(L, -1);
   lua_pop(L, 1);
 
   /* Construct full package.Message.SubMessage name. */
@@ -350,7 +350,7 @@
 
   /* Try lookup. */
   const upb_MessageDef* nested =
-      upb_DefPool_FindMessageByName(symtab, nested_name);
+      upb_DefPool_FindMessageByName(defpool, nested_name);
   if (!nested) return false;
   lupb_wrapper_pushwrapper(L, msgdef, nested, LUPB_MSGDEF);
   return true;
@@ -671,8 +671,8 @@
 
 static int lupb_FileDef_Pool(lua_State* L) {
   const upb_FileDef* f = lupb_FileDef_check(L, 1);
-  const upb_DefPool* symtab = upb_FileDef_Pool(f);
-  lupb_wrapper_pushwrapper(L, 1, symtab, LUPB_SYMTAB);
+  const upb_DefPool* defpool = upb_FileDef_Pool(f);
+  lupb_wrapper_pushwrapper(L, 1, defpool, LUPB_SYMTAB);
   return 1;
 }
 
@@ -691,30 +691,30 @@
     {"msgcount", lupb_FileDef_msgcount},
     {"name", lupb_FileDef_Name},
     {"package", lupb_FileDef_Package},
-    {"symtab", lupb_FileDef_Pool},
+    {"defpool", lupb_FileDef_Pool},
     {"syntax", lupb_FileDef_Syntax},
     {NULL, NULL}};
 
 /* lupb_DefPool
  * ****************************************************************/
 
-/* The symtab owns all defs.  Thus GC-rooting the symtab ensures that all
+/* The defpool owns all defs.  Thus GC-rooting the defpool ensures that all
  * underlying defs stay alive.
  *
- * The symtab's userval is a cache of def* -> object. */
+ * The defpool's userval is a cache of def* -> object. */
 
 #define LUPB_CACHE_INDEX 1
 
 typedef struct {
-  upb_DefPool* symtab;
+  upb_DefPool* defpool;
 } lupb_DefPool;
 
 upb_DefPool* lupb_DefPool_check(lua_State* L, int narg) {
-  lupb_DefPool* lsymtab = luaL_checkudata(L, narg, LUPB_SYMTAB);
-  if (!lsymtab->symtab) {
+  lupb_DefPool* ldefpool = luaL_checkudata(L, narg, LUPB_SYMTAB);
+  if (!ldefpool->defpool) {
     luaL_error(L, "called into dead object");
   }
-  return lsymtab->symtab;
+  return ldefpool->defpool;
 }
 
 void lupb_DefPool_pushwrapper(lua_State* L, int narg, const void* def,
@@ -739,7 +739,7 @@
     w->def = def;
     lua_replace(L, -2); /* Replace nil */
 
-    /* Set symtab as userval. */
+    /* Set defpool as userval. */
     lua_pushvalue(L, narg);
     lua_setiuservalue(L, -2, LUPB_SYMTAB_INDEX);
 
@@ -754,11 +754,12 @@
 /* upb_DefPool_New()
  *
  * Handles:
- *   upb.SymbolTable() -> <new instance>
+ *   upb.DefPool() -> <new instance>
  */
 static int lupb_DefPool_New(lua_State* L) {
-  lupb_DefPool* lsymtab = lupb_newuserdata(L, sizeof(*lsymtab), 1, LUPB_SYMTAB);
-  lsymtab->symtab = upb_DefPool_New();
+  lupb_DefPool* ldefpool =
+      lupb_newuserdata(L, sizeof(*ldefpool), 1, LUPB_SYMTAB);
+  ldefpool->defpool = upb_DefPool_New();
 
   /* Create our object cache. */
   lua_newtable(L);
@@ -769,9 +770,9 @@
   lua_setfield(L, -2, "__mode");
   lua_setmetatable(L, -2);
 
-  /* Put the symtab itself in the cache metatable. */
+  /* Put the defpool itself in the cache metatable. */
   lua_pushvalue(L, -2);
-  lua_rawsetp(L, -2, lsymtab->symtab);
+  lua_rawsetp(L, -2, ldefpool->defpool);
 
   /* Set the cache as our userval. */
   lua_setiuservalue(L, -2, LUPB_CACHE_INDEX);
@@ -780,9 +781,9 @@
 }
 
 static int lupb_DefPool_gc(lua_State* L) {
-  lupb_DefPool* lsymtab = luaL_checkudata(L, 1, LUPB_SYMTAB);
-  upb_DefPool_Free(lsymtab->symtab);
-  lsymtab->symtab = NULL;
+  lupb_DefPool* ldefpool = luaL_checkudata(L, 1, LUPB_SYMTAB);
+  upb_DefPool_Free(ldefpool->defpool);
+  ldefpool->defpool = NULL;
   return 0;
 }
 
@@ -859,7 +860,7 @@
 }
 
 static int lupb_DefPool_tostring(lua_State* L) {
-  lua_pushfstring(L, "<upb.SymbolTable>");
+  lua_pushfstring(L, "<upb.DefPool>");
   return 1;
 }
 
@@ -884,7 +885,7 @@
 }
 
 static const struct luaL_Reg lupbdef_toplevel_m[] = {
-    {"SymbolTable", lupb_DefPool_New}, {NULL, NULL}};
+    {"DefPool", lupb_DefPool_New}, {NULL, NULL}};
 
 void lupb_def_registertypes(lua_State* L) {
   lupb_setfuncs(L, lupbdef_toplevel_m);
diff --git a/upb/bindings/lua/test_upb.lua b/upb/bindings/lua/test_upb.lua
index 277a7ef..998f311 100644
--- a/upb/bindings/lua/test_upb.lua
+++ b/upb/bindings/lua/test_upb.lua
@@ -408,7 +408,7 @@
       end)
     end)
     t = {
-      upb.SymbolTable(),
+      upb.DefPool(),
     }
   end
   collectgarbage()
@@ -666,14 +666,14 @@
 end
 
 function test_foo()
-  local symtab = upb.SymbolTable()
+  local defpool = upb.DefPool()
   local filename = "external/com_google_protobuf/descriptor_proto-descriptor-set.proto.bin"
   local file = io.open(filename, "rb") or io.open("bazel-bin/" .. filename, "rb")
   assert_not_nil(file)
   local descriptor = file:read("*a")
   assert_true(#descriptor > 0)
-  symtab:add_set(descriptor)
-  local FileDescriptorSet = symtab:lookup_msg("google.protobuf.FileDescriptorSet")
+  defpool:add_set(descriptor)
+  local FileDescriptorSet = defpool:lookup_msg("google.protobuf.FileDescriptorSet")
   assert_not_nil(FileDescriptorSet)
   set = FileDescriptorSet()
   assert_equal(#set.file, 0)
@@ -690,7 +690,7 @@
 end
 
 function test_descriptor()
-  local symtab = upb.SymbolTable()
+  local defpool = upb.DefPool()
   local file_proto = descriptor.FileDescriptorProto {
     name = "test.proto",
     message_type = upb.Array(descriptor.DescriptorProto, {
@@ -699,12 +699,12 @@
       },
     })
   }
-  local file = symtab:add_file(upb.encode(file_proto))
-  assert_equal(file:symtab(), symtab)
+  local file = defpool:add_file(upb.encode(file_proto))
+  assert_equal(file:defpool(), defpool)
 end
 
 function test_descriptor_error()
-  local symtab = upb.SymbolTable()
+  local defpool = upb.DefPool()
   local file = descriptor.FileDescriptorProto()
   file.name = "test.proto"
   file.message_type[1] = descriptor.DescriptorProto{
@@ -713,12 +713,12 @@
   file.message_type[2] = descriptor.DescriptorProto{
     name = "BC."
   }
-  assert_error(function () symtab:add_file(upb.encode(file)) end)
-  assert_nil(symtab:lookup_msg("ABC"))
+  assert_error(function () defpool:add_file(upb.encode(file)) end)
+  assert_nil(defpool:lookup_msg("ABC"))
 end
 
 function test_duplicate_enumval()
-  local symtab = upb.SymbolTable()
+  local defpool = upb.DefPool()
   local file_proto = descriptor.FileDescriptorProto {
     name = "test.proto",
     message_type = upb.Array(descriptor.DescriptorProto, {
@@ -738,16 +738,16 @@
       },
     })
   }
-  assert_error(function () symtab:add_file(upb.encode(file_proto)) end)
+  assert_error(function () defpool:add_file(upb.encode(file_proto)) end)
 end
 
 function test_duplicate_filename_error()
-  local symtab = upb.SymbolTable()
+  local defpool = upb.DefPool()
   local file = descriptor.FileDescriptorProto()
   file.name = "test.proto"
-  symtab:add_file(upb.encode(file))
+  defpool:add_file(upb.encode(file))
   -- Second add with the same filename fails.
-  assert_error(function () symtab:add_file(upb.encode(file)) end)
+  assert_error(function () defpool:add_file(upb.encode(file)) end)
 end
 
 function test_encode_skipunknown()
diff --git a/upb/bindings/lua/upb.lua b/upb/bindings/lua/upb.lua
index e2d4cd1..3533309 100644
--- a/upb/bindings/lua/upb.lua
+++ b/upb/bindings/lua/upb.lua
@@ -29,7 +29,7 @@
 
 local upb = require("lupb")
 
-upb.generated_pool = upb.SymbolTable()
+upb.generated_pool = upb.DefPool()
 
 local module_metatable = {
   __index = function(t, k)
diff --git a/upb/def.hpp b/upb/def.hpp
index aaf9496..49cc560 100644
--- a/upb/def.hpp
+++ b/upb/def.hpp
@@ -373,11 +373,11 @@
   const upb_FileDef* ptr_;
 };
 
-// Non-const methods in upb::SymbolTable are NOT thread-safe.
-class SymbolTable {
+// Non-const methods in upb::DefPool are NOT thread-safe.
+class DefPool {
  public:
-  SymbolTable() : ptr_(upb_DefPool_New(), upb_DefPool_Free) {}
-  explicit SymbolTable(upb_DefPool* s) : ptr_(s, upb_DefPool_Free) {}
+  DefPool() : ptr_(upb_DefPool_New(), upb_DefPool_Free) {}
+  explicit DefPool(upb_DefPool* s) : ptr_(s, upb_DefPool_Free) {}
 
   const upb_DefPool* ptr() const { return ptr_.get(); }
   upb_DefPool* ptr() { return ptr_.get(); }
@@ -409,6 +409,9 @@
   std::unique_ptr<upb_DefPool, decltype(&upb_DefPool_Free)> ptr_;
 };
 
+// TODO(b/236632406): This typedef is deprecated. Delete it.
+using SymbolTable = DefPool;
+
 inline FileDefPtr MessageDefPtr::file() const {
   return FileDefPtr(upb_MessageDef_File(ptr_));
 }
diff --git a/upb/json_test.cc b/upb/json_test.cc
index 0791115..7abd23a 100644
--- a/upb/json_test.cc
+++ b/upb/json_test.cc
@@ -36,15 +36,15 @@
 static std::string JsonEncode(const upb_test_Box* msg, int options) {
   upb::Arena a;
   upb::Status status;
-  upb::SymbolTable symtab;
-  upb::MessageDefPtr m(upb_test_Box_getmsgdef(symtab.ptr()));
+  upb::DefPool defpool;
+  upb::MessageDefPtr m(upb_test_Box_getmsgdef(defpool.ptr()));
   EXPECT_TRUE(m.ptr() != nullptr);
 
-  size_t json_size = upb_JsonEncode(msg, m.ptr(), symtab.ptr(), options, NULL,
+  size_t json_size = upb_JsonEncode(msg, m.ptr(), defpool.ptr(), options, NULL,
                                     0, status.ptr());
   char* json_buf = (char*)upb_Arena_Malloc(a.ptr(), json_size + 1);
 
-  size_t size = upb_JsonEncode(msg, m.ptr(), symtab.ptr(), options, json_buf,
+  size_t size = upb_JsonEncode(msg, m.ptr(), defpool.ptr(), options, json_buf,
                                json_size + 1, status.ptr());
   EXPECT_EQ(size, json_size);
   return std::string(json_buf, json_size);
diff --git a/upb/msg_test.cc b/upb/msg_test.cc
index ea6f27e..d46e29f 100644
--- a/upb/msg_test.cc
+++ b/upb/msg_test.cc
@@ -57,8 +57,8 @@
   // EXPECT_FALSE(upb_test_TestExtensions_Nested_has_optional_int32_ext(ext_msg));
   EXPECT_FALSE(upb_test_has_optional_msg_ext(ext_msg));
 
-  upb::SymbolTable symtab;
-  upb::MessageDefPtr m(upb_test_TestExtensions_getmsgdef(symtab.ptr()));
+  upb::DefPool defpool;
+  upb::MessageDefPtr m(upb_test_TestExtensions_getmsgdef(defpool.ptr()));
   EXPECT_TRUE(m.ptr() != nullptr);
 
   std::string json = R"json(
@@ -70,7 +70,7 @@
   )json";
   upb::Status status;
   EXPECT_TRUE(upb_JsonDecode(json.data(), json.size(), ext_msg, m.ptr(),
-                             symtab.ptr(), 0, arena.ptr(), status.ptr()))
+                             defpool.ptr(), 0, arena.ptr(), status.ptr()))
       << status.error_message();
 
   VerifyMessage(ext_msg);
@@ -83,20 +83,20 @@
   ASSERT_GE(size, 0);
 
   upb_test_TestExtensions* ext_msg2 = upb_test_TestExtensions_parse_ex(
-      serialized, size, upb_DefPool_ExtensionRegistry(symtab.ptr()), 0,
+      serialized, size, upb_DefPool_ExtensionRegistry(defpool.ptr()), 0,
       arena.ptr());
   VerifyMessage(ext_msg2);
 
   // Test round-trip through JSON format.
   size_t json_size =
-      upb_JsonEncode(ext_msg, m.ptr(), symtab.ptr(), 0, NULL, 0, status.ptr());
+      upb_JsonEncode(ext_msg, m.ptr(), defpool.ptr(), 0, NULL, 0, status.ptr());
   char* json_buf =
       static_cast<char*>(upb_Arena_Malloc(arena.ptr(), json_size + 1));
-  upb_JsonEncode(ext_msg, m.ptr(), symtab.ptr(), 0, json_buf, json_size + 1,
+  upb_JsonEncode(ext_msg, m.ptr(), defpool.ptr(), 0, json_buf, json_size + 1,
                  status.ptr());
   upb_test_TestExtensions* ext_msg3 = upb_test_TestExtensions_new(arena.ptr());
   EXPECT_TRUE(upb_JsonDecode(json_buf, json_size, ext_msg3, m.ptr(),
-                             symtab.ptr(), 0, arena.ptr(), status.ptr()))
+                             defpool.ptr(), 0, arena.ptr(), status.ptr()))
       << status.error_message();
   VerifyMessage(ext_msg3);
 }
@@ -119,8 +119,8 @@
 
   EXPECT_FALSE(upb_test_MessageSetMember_has_message_set_extension(ext_msg));
 
-  upb::SymbolTable symtab;
-  upb::MessageDefPtr m(upb_test_TestMessageSet_getmsgdef(symtab.ptr()));
+  upb::DefPool defpool;
+  upb::MessageDefPtr m(upb_test_TestMessageSet_getmsgdef(defpool.ptr()));
   EXPECT_TRUE(m.ptr() != nullptr);
 
   std::string json = R"json(
@@ -130,7 +130,7 @@
   )json";
   upb::Status status;
   EXPECT_TRUE(upb_JsonDecode(json.data(), json.size(), ext_msg, m.ptr(),
-                             symtab.ptr(), 0, arena.ptr(), status.ptr()))
+                             defpool.ptr(), 0, arena.ptr(), status.ptr()))
       << status.error_message();
 
   VerifyMessageSet(ext_msg);
@@ -143,20 +143,20 @@
   ASSERT_GE(size, 0);
 
   upb_test_TestMessageSet* ext_msg2 = upb_test_TestMessageSet_parse_ex(
-      serialized, size, upb_DefPool_ExtensionRegistry(symtab.ptr()), 0,
+      serialized, size, upb_DefPool_ExtensionRegistry(defpool.ptr()), 0,
       arena.ptr());
   VerifyMessageSet(ext_msg2);
 
   // Test round-trip through JSON format.
   size_t json_size =
-      upb_JsonEncode(ext_msg, m.ptr(), symtab.ptr(), 0, NULL, 0, status.ptr());
+      upb_JsonEncode(ext_msg, m.ptr(), defpool.ptr(), 0, NULL, 0, status.ptr());
   char* json_buf =
       static_cast<char*>(upb_Arena_Malloc(arena.ptr(), json_size + 1));
-  upb_JsonEncode(ext_msg, m.ptr(), symtab.ptr(), 0, json_buf, json_size + 1,
+  upb_JsonEncode(ext_msg, m.ptr(), defpool.ptr(), 0, json_buf, json_size + 1,
                  status.ptr());
   upb_test_TestMessageSet* ext_msg3 = upb_test_TestMessageSet_new(arena.ptr());
   EXPECT_TRUE(upb_JsonDecode(json_buf, json_size, ext_msg3, m.ptr(),
-                             symtab.ptr(), 0, arena.ptr(), status.ptr()))
+                             defpool.ptr(), 0, arena.ptr(), status.ptr()))
       << status.error_message();
   VerifyMessageSet(ext_msg3);
 }
@@ -188,11 +188,11 @@
   ASSERT_TRUE(serialized != nullptr);
   ASSERT_GE(size, 0);
 
-  upb::SymbolTable symtab;
-  upb::MessageDefPtr m(upb_test_TestMessageSet_getmsgdef(symtab.ptr()));
+  upb::DefPool defpool;
+  upb::MessageDefPtr m(upb_test_TestMessageSet_getmsgdef(defpool.ptr()));
   EXPECT_TRUE(m.ptr() != nullptr);
   upb_test_TestMessageSet* message_set = upb_test_TestMessageSet_parse_ex(
-      serialized, size, upb_DefPool_ExtensionRegistry(symtab.ptr()), 0,
+      serialized, size, upb_DefPool_ExtensionRegistry(defpool.ptr()), 0,
       arena.ptr());
   ASSERT_TRUE(message_set != nullptr);
 
@@ -437,8 +437,8 @@
       test_msg, kUpb_EncodeOption_CheckRequired, arena.ptr(), &size);
   ASSERT_TRUE(serialized == nullptr);
 
-  upb::SymbolTable symtab;
-  upb::MessageDefPtr m(upb_test_TestMaxRequiredFields_getmsgdef(symtab.ptr()));
+  upb::DefPool defpool;
+  upb::MessageDefPtr m(upb_test_TestMaxRequiredFields_getmsgdef(defpool.ptr()));
   upb_MessageValue val;
   val.int32_val = 1;
   for (int i = 1; i <= 61; i++) {
diff --git a/upb/test_cpp.cc b/upb/test_cpp.cc
index 29021cb..4d4aec6 100644
--- a/upb/test_cpp.cc
+++ b/upb/test_cpp.cc
@@ -50,8 +50,8 @@
 #include "upb/port_def.inc"
 
 TEST(Cpp, Iteration) {
-  upb::SymbolTable symtab;
-  upb::MessageDefPtr md(upb_test_TestMessage_getmsgdef(symtab.ptr()));
+  upb::DefPool defpool;
+  upb::MessageDefPtr md(upb_test_TestMessage_getmsgdef(defpool.ptr()));
 
   // Test range-based for on both fields and oneofs (with the iterator adaptor).
   int field_count = 0;
@@ -131,17 +131,17 @@
 }
 
 TEST(Cpp, Default) {
-  upb::SymbolTable symtab;
+  upb::DefPool defpool;
   upb::Arena arena;
-  upb::MessageDefPtr md(upb_test_TestMessage_getmsgdef(symtab.ptr()));
+  upb::MessageDefPtr md(upb_test_TestMessage_getmsgdef(defpool.ptr()));
   upb_test_TestMessage* msg = upb_test_TestMessage_new(arena.ptr());
   size_t size = upb_JsonEncode(msg, md.ptr(), NULL, 0, NULL, 0, NULL);
   EXPECT_EQ(2, size);  // "{}"
 }
 
 TEST(Cpp, JsonNull) {
-  upb::SymbolTable symtab;
-  upb::MessageDefPtr md(upb_test_TestMessage_getmsgdef(symtab.ptr()));
+  upb::DefPool defpool;
+  upb::MessageDefPtr md(upb_test_TestMessage_getmsgdef(defpool.ptr()));
   upb::FieldDefPtr i32_f = md.FindFieldByName("i32");
   upb::FieldDefPtr str_f = md.FindFieldByName("str");
   ASSERT_TRUE(i32_f);
@@ -152,9 +152,9 @@
 }
 
 TEST(Cpp, TimestampEncoder) {
-  upb::SymbolTable symtab;
+  upb::DefPool defpool;
   upb::Arena arena;
-  upb::MessageDefPtr md(google_protobuf_Timestamp_getmsgdef(symtab.ptr()));
+  upb::MessageDefPtr md(google_protobuf_Timestamp_getmsgdef(defpool.ptr()));
   google_protobuf_Timestamp* timestamp_upb =
       google_protobuf_Timestamp_new(arena.ptr());
   google_protobuf_Timestamp* timestamp_upb_decoded =
diff --git a/upb/util/def_to_proto_test.cc b/upb/util/def_to_proto_test.cc
index b3dd628..d8156e3 100644
--- a/upb/util/def_to_proto_test.cc
+++ b/upb/util/def_to_proto_test.cc
@@ -76,13 +76,13 @@
 
 // A gtest matcher that verifies that a proto is equal to `proto`.  Both `proto`
 // and `arg` must be messages of type `msgdef_func` (a .upbdefs.h function that
-// loads a known msgdef into the given symtab).
+// loads a known msgdef into the given defpool).
 MATCHER_P2(EqualsUpbProto, proto, msgdef_func,
            negation ? "are not equal" : "are equal") {
-  upb::SymbolTable symtab;
+  upb::DefPool defpool;
   google::protobuf::DescriptorPool pool;
   google::protobuf::DynamicMessageFactory factory;
-  upb::MessageDefPtr msgdef(msgdef_func(symtab.ptr()));
+  upb::MessageDefPtr msgdef(msgdef_func(defpool.ptr()));
   EXPECT_TRUE(msgdef.ptr() != nullptr);
   const google::protobuf::Descriptor* desc =
       AddMessageDescriptor(msgdef, &pool);
@@ -117,13 +117,13 @@
 //   serialized descriptor -> upb def -> serialized descriptor
 TEST(DefToProto, Test) {
   upb::Arena arena;
-  upb::SymbolTable symtab;
+  upb::DefPool defpool;
   upb_StringView test_file_desc =
       upb_util_def_to_proto_test_proto_upbdefinit.descriptor;
   const auto* file_desc = google_protobuf_FileDescriptorProto_parse(
       test_file_desc.data, test_file_desc.size, arena.ptr());
 
-  upb::MessageDefPtr msgdef(pkg_Message_getmsgdef(symtab.ptr()));
+  upb::MessageDefPtr msgdef(pkg_Message_getmsgdef(defpool.ptr()));
   upb::FileDefPtr file = msgdef.file();
   CheckFile(file, file_desc);
 }
@@ -131,15 +131,16 @@
 // Like the previous test, but uses a message layout built at runtime.
 TEST(DefToProto, TestRuntimeReflection) {
   upb::Arena arena;
-  upb::SymbolTable symtab;
+  upb::DefPool defpool;
   upb_StringView test_file_desc =
       upb_util_def_to_proto_test_proto_upbdefinit.descriptor;
   const auto* file_desc = google_protobuf_FileDescriptorProto_parse(
       test_file_desc.data, test_file_desc.size, arena.ptr());
 
   _upb_DefPool_LoadDefInitEx(
-      symtab.ptr(), &upb_util_def_to_proto_test_proto_upbdefinit, true);
-  upb::FileDefPtr file = symtab.FindFileByName(
+      defpool.ptr(),
+      &upb_util_def_to_proto_test_proto_upbdefinit, true);
+  upb::FileDefPtr file = defpool.FindFileByName(
       upb_util_def_to_proto_test_proto_upbdefinit.filename);
   CheckFile(file, file_desc);
 }
diff --git a/upb/util/required_fields_test.cc b/upb/util/required_fields_test.cc
index 860363f..8550410 100644
--- a/upb/util/required_fields_test.cc
+++ b/upb/util/required_fields_test.cc
@@ -60,25 +60,25 @@
 void CheckRequired(absl::string_view json,
                    const std::vector<std::string>& missing) {
   upb::Arena arena;
-  upb::SymbolTable symtab;
+  upb::DefPool defpool;
   upb_util_test_TestRequiredFields* test_msg =
       upb_util_test_TestRequiredFields_new(arena.ptr());
   upb::MessageDefPtr m(
-      upb_util_test_TestRequiredFields_getmsgdef(symtab.ptr()));
+      upb_util_test_TestRequiredFields_getmsgdef(defpool.ptr()));
   upb::Status status;
   EXPECT_TRUE(upb_JsonDecode(json.data(), json.size(), test_msg, m.ptr(),
-                             symtab.ptr(), 0, arena.ptr(), status.ptr()))
+                             defpool.ptr(), 0, arena.ptr(), status.ptr()))
       << status.error_message();
   upb_FieldPathEntry* entries;
   EXPECT_EQ(!missing.empty(), upb_util_HasUnsetRequired(
-                                  test_msg, m.ptr(), symtab.ptr(), &entries));
+                                  test_msg, m.ptr(), defpool.ptr(), &entries));
   EXPECT_EQ(missing, PathsToText(entries));
   free(entries);
 
   // Verify that we can pass a NULL pointer to entries when we don't care about
   // them.
   EXPECT_EQ(!missing.empty(),
-            upb_util_HasUnsetRequired(test_msg, m.ptr(), symtab.ptr(), NULL));
+            upb_util_HasUnsetRequired(test_msg, m.ptr(), defpool.ptr(), NULL));
 }
 
 // message HasRequiredField {
