diff --git a/python/message.c b/python/message.c
index 08cba55..7ef2f92 100644
--- a/python/message.c
+++ b/python/message.c
@@ -37,7 +37,7 @@
 #include "upb/text_encode.h"
 #include "upb/util/required_fields.h"
 
-static const upb_msgdef* PyUpb_MessageMeta_GetMsgdef(PyObject* cls);
+static const upb_MessageDef* PyUpb_MessageMeta_GetMsgdef(PyObject* cls);
 static PyObject* PyUpb_MessageMeta_GetAttr(PyObject* self, PyObject* name);
 
 // -----------------------------------------------------------------------------
@@ -63,7 +63,7 @@
   // the version of Python we were compiled against, which may be different
   // than the version we are dynamically linked against.  Here we want the
   // version that is actually running in this process.
-  long python_version_hex;     // PY_VERSION_HEX
+  long python_version_hex;  // PY_VERSION_HEX
 } PyUpb_CPythonBits;
 
 // A global containing the values for this process.
@@ -151,9 +151,9 @@
 // The parent may also be non-present, in which case a mutation will trigger a
 // chain reaction.
 typedef struct PyUpb_CMessage {
-  PyObject_HEAD
+  PyObject_HEAD;
   PyObject* arena;
-  uintptr_t def;  // Tagged, low bit 1 == upb_fielddef*, else upb_msgdef*
+  uintptr_t def;  // Tagged, low bit 1 == upb_FieldDef*, else upb_MessageDef*
   union {
     // when def is msgdef, the data for this msg.
     upb_msg* msg;
@@ -170,18 +170,18 @@
 
 bool PyUpb_CMessage_IsStub(PyUpb_CMessage* msg) { return msg->def & 1; }
 
-const upb_fielddef* PyUpb_CMessage_GetFieldDef(PyUpb_CMessage* msg) {
+const upb_FieldDef* PyUpb_CMessage_GetFieldDef(PyUpb_CMessage* msg) {
   assert(PyUpb_CMessage_IsStub(msg));
   return (void*)(msg->def & ~(uintptr_t)1);
 }
 
-static const upb_msgdef* _PyUpb_CMessage_GetMsgdef(PyUpb_CMessage* msg) {
+static const upb_MessageDef* _PyUpb_CMessage_GetMsgdef(PyUpb_CMessage* msg) {
   return PyUpb_CMessage_IsStub(msg)
-             ? upb_fielddef_msgsubdef(PyUpb_CMessage_GetFieldDef(msg))
+             ? upb_FieldDef_MessageSubDef(PyUpb_CMessage_GetFieldDef(msg))
              : (void*)msg->def;
 }
 
-const upb_msgdef* PyUpb_CMessage_GetMsgdef(PyObject* self) {
+const upb_MessageDef* PyUpb_CMessage_GetMsgdef(PyObject* self) {
   return _PyUpb_CMessage_GetMsgdef((PyUpb_CMessage*)self);
 }
 
@@ -214,11 +214,11 @@
 
 static PyObject* PyUpb_CMessage_New(PyObject* cls, PyObject* unused_args,
                                     PyObject* unused_kwargs) {
-  const upb_msgdef* msgdef = PyUpb_MessageMeta_GetMsgdef(cls);
+  const upb_MessageDef* msgdef = PyUpb_MessageMeta_GetMsgdef(cls);
   PyUpb_CMessage* msg = (void*)PyType_GenericAlloc((PyTypeObject*)cls, 0);
   msg->def = (uintptr_t)msgdef;
   msg->arena = PyUpb_Arena_New();
-  msg->ptr.msg = upb_msg_new(msgdef, PyUpb_Arena_Get(msg->arena));
+  msg->ptr.msg = upb_Message_New(msgdef, PyUpb_Arena_Get(msg->arena));
   msg->unset_subobj_map = NULL;
   msg->ext_dict = NULL;
   msg->version = 0;
@@ -238,8 +238,8 @@
  * and sets an exception of type `exc_type` if provided.
  */
 static bool PyUpb_CMessage_LookupName(PyUpb_CMessage* self, PyObject* py_name,
-                                      const upb_fielddef** f,
-                                      const upb_oneofdef** o,
+                                      const upb_FieldDef** f,
+                                      const upb_OneofDef** o,
                                       PyObject* exc_type) {
   assert(f || o);
   Py_ssize_t size;
@@ -250,13 +250,12 @@
     PyBytes_AsStringAndSize(py_name, (char**)&name, &size);
   }
   if (!name) return NULL;
-  const upb_msgdef* msgdef = _PyUpb_CMessage_GetMsgdef(self);
+  const upb_MessageDef* msgdef = _PyUpb_CMessage_GetMsgdef(self);
 
-  if (!upb_msgdef_lookupname(msgdef, name, size, f, o)) {
+  if (!upb_MessageDef_FindByNameWithSize(msgdef, name, size, f, o)) {
     if (exc_type) {
-      PyErr_Format(exc_type,
-                   "Protocol message %s has no \"%s\" field.",
-                   upb_msgdef_name(msgdef), name);
+      PyErr_Format(exc_type, "Protocol message %s has no \"%s\" field.",
+                   upb_MessageDef_Name(msgdef), name);
     }
     return false;
   }
@@ -296,17 +295,17 @@
 }
 
 int PyUpb_CMessage_InitMapAttributes(PyObject* map, PyObject* value,
-                                     const upb_fielddef* f) {
-  const upb_msgdef* entry_m = upb_fielddef_msgsubdef(f);
-  const upb_fielddef* val_f = upb_msgdef_field(entry_m, 1);
+                                     const upb_FieldDef* f) {
+  const upb_MessageDef* entry_m = upb_FieldDef_MessageSubDef(f);
+  const upb_FieldDef* val_f = upb_MessageDef_Field(entry_m, 1);
   PyObject* it = NULL;
   PyObject* tmp = NULL;
   int ret = -1;
-  if (upb_fielddef_issubmsg(val_f)) {
+  if (upb_FieldDef_IsSubMessage(val_f)) {
     it = PyObject_GetIter(value);
     if (it == NULL) {
       PyErr_Format(PyExc_TypeError, "Argument for field %s is not iterable",
-                   upb_fielddef_fullname(f));
+                   upb_FieldDef_FullName(f));
       goto err;
     }
     PyObject* e;
@@ -334,7 +333,7 @@
 void PyUpb_CMessage_EnsureReified(PyUpb_CMessage* self);
 
 static bool PyUpb_CMessage_InitMapAttribute(PyObject* _self, PyObject* name,
-                                            const upb_fielddef* f,
+                                            const upb_FieldDef* f,
                                             PyObject* value) {
   PyObject* map = PyUpb_CMessage_GetAttr(_self, name);
   int ok = PyUpb_CMessage_InitMapAttributes(map, value, f);
@@ -366,9 +365,9 @@
     assert(!PyErr_Occurred());
     ok = PyUpb_CMessage_InitAttributes(submsg, NULL, value) >= 0;
   } else {
-    const upb_msgdef* m = PyUpb_CMessage_GetMsgdef(_self);
+    const upb_MessageDef* m = PyUpb_CMessage_GetMsgdef(_self);
     PyErr_Format(PyExc_TypeError, "Message must be initialized with a dict: %s",
-                 upb_msgdef_fullname(m));
+                 upb_MessageDef_FullName(m));
     ok = false;
   }
   Py_DECREF(submsg);
@@ -376,13 +375,13 @@
 }
 
 static bool PyUpb_CMessage_InitScalarAttribute(upb_msg* msg,
-                                               const upb_fielddef* f,
+                                               const upb_FieldDef* f,
                                                PyObject* value,
-                                               upb_arena* arena) {
-  upb_msgval msgval;
+                                               upb_Arena* arena) {
+  upb_MessageValue msgval;
   assert(!PyErr_Occurred());
   if (!PyUpb_PyToUpb(value, f, &msgval, arena)) return false;
-  upb_msg_set(msg, f, msgval, arena);
+  upb_Message_Set(msg, f, msgval, arena);
   return true;
 }
 
@@ -403,11 +402,11 @@
   PyObject* value;
   PyUpb_CMessage_EnsureReified(self);
   upb_msg* msg = PyUpb_CMessage_GetMsg(self);
-  upb_arena* arena = PyUpb_Arena_Get(self->arena);
+  upb_Arena* arena = PyUpb_Arena_Get(self->arena);
 
   while (PyDict_Next(kwargs, &pos, &name, &value)) {
     assert(!PyErr_Occurred());
-    const upb_fielddef* f;
+    const upb_FieldDef* f;
     assert(!PyErr_Occurred());
     if (!PyUpb_CMessage_LookupName(self, name, &f, NULL, PyExc_ValueError)) {
       return -1;
@@ -417,11 +416,11 @@
 
     assert(!PyErr_Occurred());
 
-    if (upb_fielddef_ismap(f)) {
+    if (upb_FieldDef_IsMap(f)) {
       if (!PyUpb_CMessage_InitMapAttribute(_self, name, f, value)) return -1;
-    } else if (upb_fielddef_isseq(f)) {
+    } else if (upb_FieldDef_IsRepeated(f)) {
       if (!PyUpb_CMessage_InitRepeatedAttribute(_self, name, value)) return -1;
-    } else if (upb_fielddef_issubmsg(f)) {
+    } else if (upb_FieldDef_IsSubMessage(f)) {
       if (!PyUpb_CMessage_InitMessageAttribute(_self, name, value)) return -1;
     } else {
       if (!PyUpb_CMessage_InitScalarAttribute(msg, f, value, arena)) return -1;
@@ -443,9 +442,9 @@
   return PyUpb_CMessage_InitAttributes(_self, args, kwargs);
 }
 
-static PyObject* PyUpb_CMessage_NewStub(PyObject* parent, const upb_fielddef* f,
+static PyObject* PyUpb_CMessage_NewStub(PyObject* parent, const upb_FieldDef* f,
                                         PyObject* arena) {
-  const upb_msgdef* sub_m = upb_fielddef_msgsubdef(f);
+  const upb_MessageDef* sub_m = upb_FieldDef_MessageSubDef(f);
   PyObject* cls = PyUpb_Descriptor_GetClass(sub_m);
 
   PyUpb_CMessage* msg = (void*)PyType_GenericAlloc((PyTypeObject*)cls, 0);
@@ -468,9 +467,9 @@
   if (!PyObject_TypeCheck(_m2, m1->ob_base.ob_type)) {
     return false;
   }
-  const upb_msgdef* m1_msgdef = _PyUpb_CMessage_GetMsgdef(m1);
+  const upb_MessageDef* m1_msgdef = _PyUpb_CMessage_GetMsgdef(m1);
 #ifndef NDEBUG
-  const upb_msgdef* m2_msgdef = _PyUpb_CMessage_GetMsgdef(m2);
+  const upb_MessageDef* m2_msgdef = _PyUpb_CMessage_GetMsgdef(m2);
   assert(m1_msgdef == m2_msgdef);
 #endif
   const upb_msg* m1_msg = PyUpb_CMessage_GetIfReified((PyObject*)m1);
@@ -478,20 +477,20 @@
   return PyUpb_Message_IsEqual(m1_msg, m2_msg, m1_msgdef);
 }
 
-static const upb_fielddef* PyUpb_CMessage_InitAsMsg(PyUpb_CMessage* m,
-                                                    upb_arena* arena) {
-  const upb_fielddef* f = PyUpb_CMessage_GetFieldDef(m);
-  m->ptr.msg = upb_msg_new(upb_fielddef_msgsubdef(f), arena);
-  m->def = (uintptr_t)upb_fielddef_msgsubdef(f);
+static const upb_FieldDef* PyUpb_CMessage_InitAsMsg(PyUpb_CMessage* m,
+                                                    upb_Arena* arena) {
+  const upb_FieldDef* f = PyUpb_CMessage_GetFieldDef(m);
+  m->ptr.msg = upb_Message_New(upb_FieldDef_MessageSubDef(f), arena);
+  m->def = (uintptr_t)upb_FieldDef_MessageSubDef(f);
   PyUpb_ObjCache_Add(m->ptr.msg, &m->ob_base);
   return f;
 }
 
 static void PyUpb_CMessage_SetField(PyUpb_CMessage* parent,
-                                    const upb_fielddef* f,
-                                    PyUpb_CMessage* child, upb_arena* arena) {
-  upb_msgval msgval = {.msg_val = PyUpb_CMessage_GetMsg(child)};
-  upb_msg_set(PyUpb_CMessage_GetMsg(parent), f, msgval, arena);
+                                    const upb_FieldDef* f,
+                                    PyUpb_CMessage* child, upb_Arena* arena) {
+  upb_MessageValue msgval = {.msg_val = PyUpb_CMessage_GetMsg(child)};
+  upb_Message_Set(PyUpb_CMessage_GetMsg(parent), f, msgval, arena);
   PyUpb_WeakMap_Delete(parent->unset_subobj_map, f);
   // Releases a ref previously owned by child->ptr.parent of our child.
   Py_DECREF(child);
@@ -517,18 +516,18 @@
  */
 void PyUpb_CMessage_EnsureReified(PyUpb_CMessage* self) {
   if (!PyUpb_CMessage_IsStub(self)) return;
-  upb_arena* arena = PyUpb_Arena_Get(self->arena);
+  upb_Arena* arena = PyUpb_Arena_Get(self->arena);
 
   // This is a non-present message. We need to create a real upb_msg for this
   // object and every parent until we reach a present message.
   PyUpb_CMessage* child = self;
   PyUpb_CMessage* parent = self->ptr.parent;
-  const upb_fielddef* child_f = PyUpb_CMessage_InitAsMsg(child, arena);
+  const upb_FieldDef* child_f = PyUpb_CMessage_InitAsMsg(child, arena);
   Py_INCREF(child);  // To avoid a special-case in PyUpb_CMessage_SetField().
 
   do {
     PyUpb_CMessage* next_parent = parent->ptr.parent;
-    const upb_fielddef* parent_f = NULL;
+    const upb_FieldDef* parent_f = NULL;
     if (PyUpb_CMessage_IsStub(parent)) {
       parent_f = PyUpb_CMessage_InitAsMsg(parent, arena);
     }
@@ -549,20 +548,20 @@
  * PyUpb_CMessage_Reify()
  *
  * The message equivalent of PyUpb_*Container_Reify(), this transitions
- * the wrapper from the unset state (owning a reference on self->ptr.parent) to the
- * set state (having a non-owning pointer to self->ptr.msg).
+ * the wrapper from the unset state (owning a reference on self->ptr.parent) to
+ * the set state (having a non-owning pointer to self->ptr.msg).
  */
-static void PyUpb_CMessage_Reify(PyUpb_CMessage* self, const upb_fielddef* f,
+static void PyUpb_CMessage_Reify(PyUpb_CMessage* self, const upb_FieldDef* f,
                                  upb_msg* msg) {
   assert(f == PyUpb_CMessage_GetFieldDef(self));
   if (!msg) {
-    const upb_msgdef* msgdef = PyUpb_CMessage_GetMsgdef((PyObject*)self);
-    msg = upb_msg_new(msgdef, PyUpb_Arena_Get(self->arena));
+    const upb_MessageDef* msgdef = PyUpb_CMessage_GetMsgdef((PyObject*)self);
+    msg = upb_Message_New(msgdef, PyUpb_Arena_Get(self->arena));
   }
   PyUpb_ObjCache_Add(msg, &self->ob_base);
   Py_DECREF(&self->ptr.parent->ob_base);
   self->ptr.msg = msg;  // Overwrites self->ptr.parent
-  self->def = (uintptr_t)upb_fielddef_msgsubdef(f);
+  self->def = (uintptr_t)upb_FieldDef_MessageSubDef(f);
   PyUpb_CMessage_SyncSubobjs(self);
 }
 
@@ -580,7 +579,7 @@
  *   # SyncSubobjs() is required to connect our existing 'sub' wrapper to the
  *   # newly created foo.submsg data in C.
  *   foo.MergeFrom(FooMessage(submsg={}))
- * 
+ *
  * This requires that all of the new sub-objects that have appeared are owned
  * by `self`'s arena.
  */
@@ -601,16 +600,16 @@
   Py_INCREF(&self->ob_base);
 
   while (PyUpb_WeakMap_Next(subobj_map, &key, &obj, &iter)) {
-    const upb_fielddef* f = key;
-    if (upb_fielddef_haspresence(f) && !upb_msg_has(msg, f)) continue;
-    upb_msgval msgval = upb_msg_get(msg, f);
+    const upb_FieldDef* f = key;
+    if (upb_FieldDef_HasPresence(f) && !upb_Message_Has(msg, f)) continue;
+    upb_MessageValue msgval = upb_Message_Get(msg, f);
     PyUpb_WeakMap_DeleteIter(subobj_map, &iter);
-    if (upb_fielddef_ismap(f)) {
+    if (upb_FieldDef_IsMap(f)) {
       if (!msgval.map_val) continue;
-      PyUpb_MapContainer_Reify(obj, (upb_map*)msgval.map_val);
-    } else if (upb_fielddef_isseq(f)) {
+      PyUpb_MapContainer_Reify(obj, (upb_Map*)msgval.map_val);
+    } else if (upb_FieldDef_IsRepeated(f)) {
       if (!msgval.array_val) continue;
-      PyUpb_RepeatedContainer_Reify(obj, (upb_array*)msgval.array_val);
+      PyUpb_RepeatedContainer_Reify(obj, (upb_Array*)msgval.array_val);
     } else {
       PyUpb_CMessage* sub = (void*)obj;
       assert(self == sub->ptr.parent);
@@ -629,8 +628,8 @@
     return PyUnicode_FromStringAndSize(NULL, 0);
   }
   upb_msg* msg = PyUpb_CMessage_GetMsg(self);
-  const upb_msgdef* msgdef = _PyUpb_CMessage_GetMsgdef(self);
-  const upb_symtab* symtab = upb_filedef_symtab(upb_msgdef_file(msgdef));
+  const upb_MessageDef* msgdef = _PyUpb_CMessage_GetMsgdef(self);
+  const upb_DefPool* symtab = upb_FileDef_Pool(upb_MessageDef_File(msgdef));
   char buf[1024];
   int options = UPB_TXTENC_SKIPUNKNOWN;
   size_t size = upb_text_encode(msg, msgdef, symtab, options, buf, sizeof(buf));
@@ -659,17 +658,17 @@
   return PyBool_FromLong(ret);
 }
 
-void PyUpb_CMessage_CacheDelete(PyObject* _self, const upb_fielddef* f) {
+void PyUpb_CMessage_CacheDelete(PyObject* _self, const upb_FieldDef* f) {
   PyUpb_CMessage* self = (void*)_self;
   PyUpb_WeakMap_Delete(self->unset_subobj_map, f);
 }
 
-void PyUpb_CMessage_SetConcreteSubobj(PyObject* _self, const upb_fielddef* f,
-                                      upb_msgval subobj) {
+void PyUpb_CMessage_SetConcreteSubobj(PyObject* _self, const upb_FieldDef* f,
+                                      upb_MessageValue subobj) {
   PyUpb_CMessage* self = (void*)_self;
   PyUpb_CMessage_EnsureReified(self);
   PyUpb_CMessage_CacheDelete(_self, f);
-  upb_msg_set(self->ptr.msg, f, subobj, PyUpb_Arena_Get(self->arena));
+  upb_Message_Set(self->ptr.msg, f, subobj, PyUpb_Arena_Get(self->arena));
 }
 
 static void PyUpb_CMessage_Dealloc(PyObject* _self) {
@@ -702,7 +701,7 @@
   }
 }
 
-PyObject* PyUpb_CMessage_Get(upb_msg* u_msg, const upb_msgdef* m,
+PyObject* PyUpb_CMessage_Get(upb_msg* u_msg, const upb_MessageDef* m,
                              PyObject* arena) {
   PyObject* ret = PyUpb_ObjCache_Get(u_msg);
   if (ret) return ret;
@@ -728,15 +727,15 @@
  *
  * Non-present messages return "stub" objects that point to their parent, but
  * will materialize into real upb objects if they are mutated.
- * 
+ *
  * Note: we do *not* create stubs for repeated/map fields unless the parent
  * is a stub:
- * 
+ *
  *    msg = TestMessage()
  *    msg.submessage                # (A) Creates a stub
  *    msg.repeated_foo              # (B) Does *not* create a stub
  *    msg.submessage.repeated_bar   # (C) Creates a stub
- *    
+ *
  * In case (B) we have some freedom: we could either create a stub, or create
  * a reified object with underlying data.  It appears that either could work
  * equally well, with no observable change to users.  There isn't a clear
@@ -746,7 +745,7 @@
  * within the realm of possibility.
  */
 PyObject* PyUpb_CMessage_GetStub(PyUpb_CMessage* self,
-                                 const upb_fielddef* field) {
+                                 const upb_FieldDef* field) {
   PyObject* _self = (void*)self;
   if (!self->unset_subobj_map) {
     self->unset_subobj_map = PyUpb_WeakMap_New();
@@ -755,9 +754,9 @@
 
   if (subobj) return subobj;
 
-  if (upb_fielddef_ismap(field)) {
+  if (upb_FieldDef_IsMap(field)) {
     subobj = PyUpb_MapContainer_NewStub(_self, field, self->arena);
-  } else if (upb_fielddef_isseq(field)) {
+  } else if (upb_FieldDef_IsRepeated(field)) {
     subobj = PyUpb_RepeatedContainer_NewStub(_self, field, self->arena);
   } else {
     subobj = PyUpb_CMessage_NewStub(&self->ob_base, field, self->arena);
@@ -769,11 +768,11 @@
 }
 
 PyObject* PyUpb_CMessage_GetPresentWrapper(PyUpb_CMessage* self,
-                                           const upb_fielddef* field) {
+                                           const upb_FieldDef* field) {
   assert(!PyUpb_CMessage_IsStub(self));
-  upb_mutmsgval mutval =
-      upb_msg_mutable(self->ptr.msg, field, PyUpb_Arena_Get(self->arena));
-  if (upb_fielddef_ismap(field)) {
+  upb_MutableMessageValue mutval =
+      upb_Message_Mutable(self->ptr.msg, field, PyUpb_Arena_Get(self->arena));
+  if (upb_FieldDef_IsMap(field)) {
     return PyUpb_MapContainer_GetOrCreateWrapper(mutval.map, field,
                                                  self->arena);
   } else {
@@ -783,13 +782,13 @@
 }
 
 PyObject* PyUpb_CMessage_GetScalarValue(PyUpb_CMessage* self,
-                                        const upb_fielddef* field) {
-  upb_msgval val;
+                                        const upb_FieldDef* field) {
+  upb_MessageValue val;
   if (PyUpb_CMessage_IsStub(self)) {
     // Unset message always returns default values.
-    val = upb_fielddef_default(field);
+    val = upb_FieldDef_Default(field);
   } else {
-    val = upb_msg_get(self->ptr.msg, field);
+    val = upb_Message_Get(self->ptr.msg, field);
   }
   return PyUpb_UpbToPy(val, field, self->arena);
 }
@@ -798,7 +797,7 @@
  * PyUpb_CMessage_GetFieldValue()
  *
  * Implements the equivalent of getattr(msg, field), once `field` has
- * already been resolved to a `upb_fielddef*`.
+ * already been resolved to a `upb_FieldDef*`.
  *
  * This may involve constructing a wrapper object for the given field, or
  * returning one that was previously constructed.  If the field is not actually
@@ -806,14 +805,14 @@
  * connected to any C data.
  */
 PyObject* PyUpb_CMessage_GetFieldValue(PyObject* _self,
-                                       const upb_fielddef* field) {
+                                       const upb_FieldDef* field) {
   PyUpb_CMessage* self = (void*)_self;
-  assert(upb_fielddef_containingtype(field) == PyUpb_CMessage_GetMsgdef(_self));
-  bool submsg = upb_fielddef_issubmsg(field);
-  bool seq = upb_fielddef_isseq(field);
+  assert(upb_FieldDef_ContainingType(field) == PyUpb_CMessage_GetMsgdef(_self));
+  bool submsg = upb_FieldDef_IsSubMessage(field);
+  bool seq = upb_FieldDef_IsRepeated(field);
 
   if ((PyUpb_CMessage_IsStub(self) && (submsg || seq)) ||
-      (submsg && !seq && !upb_msg_has(self->ptr.msg, field))) {
+      (submsg && !seq && !upb_Message_Has(self->ptr.msg, field))) {
     return PyUpb_CMessage_GetStub(self, field);
   } else if (seq) {
     return PyUpb_CMessage_GetPresentWrapper(self, field);
@@ -822,28 +821,28 @@
   }
 }
 
-int PyUpb_CMessage_SetFieldValue(PyObject* _self, const upb_fielddef* field,
+int PyUpb_CMessage_SetFieldValue(PyObject* _self, const upb_FieldDef* field,
                                  PyObject* value, PyObject* exc) {
   PyUpb_CMessage* self = (void*)_self;
   assert(value);
 
-  if (upb_fielddef_issubmsg(field) || upb_fielddef_isseq(field)) {
+  if (upb_FieldDef_IsSubMessage(field) || upb_FieldDef_IsRepeated(field)) {
     PyErr_Format(exc,
                  "Assignment not allowed to message, map, or repeated "
                  "field \"%s\" in protocol message object.",
-                 upb_fielddef_name(field));
+                 upb_FieldDef_Name(field));
     return -1;
   }
 
   PyUpb_CMessage_EnsureReified(self);
 
-  upb_msgval val;
-  upb_arena* arena = PyUpb_Arena_Get(self->arena);
+  upb_MessageValue val;
+  upb_Arena* arena = PyUpb_Arena_Get(self->arena);
   if (!PyUpb_PyToUpb(value, field, &val, arena)) {
     return -1;
   }
 
-  upb_msg_set(self->ptr.msg, field, val, arena);
+  upb_Message_Set(self->ptr.msg, field, val, arena);
   return 0;
 }
 
@@ -866,7 +865,7 @@
   PyUpb_CMessage* self = (void*)_self;
 
   // Lookup field by name.
-  const upb_fielddef* field;
+  const upb_FieldDef* field;
   if (PyUpb_CMessage_LookupName(self, attr, &field, NULL, NULL)) {
     return PyUpb_CMessage_GetFieldValue(_self, field);
   }
@@ -898,34 +897,36 @@
 static int PyUpb_CMessage_SetAttr(PyObject* _self, PyObject* attr,
                                   PyObject* value) {
   PyUpb_CMessage* self = (void*)_self;
-  const upb_fielddef* field;
+  const upb_FieldDef* field;
   if (!PyUpb_CMessage_LookupName(self, attr, &field, NULL,
                                  PyExc_AttributeError)) {
     return -1;
   }
 
-  return PyUpb_CMessage_SetFieldValue(_self, field, value, PyExc_AttributeError);
+  return PyUpb_CMessage_SetFieldValue(_self, field, value,
+                                      PyExc_AttributeError);
 }
 
 static PyObject* PyUpb_CMessage_HasField(PyObject* _self, PyObject* arg) {
   PyUpb_CMessage* self = (void*)_self;
-  const upb_fielddef* field;
-  const upb_oneofdef* oneof;
+  const upb_FieldDef* field;
+  const upb_OneofDef* oneof;
 
   if (!PyUpb_CMessage_LookupName(self, arg, &field, &oneof, PyExc_ValueError)) {
     return NULL;
   }
 
-  if (field && !upb_fielddef_haspresence(field)) {
+  if (field && !upb_FieldDef_HasPresence(field)) {
     PyErr_Format(PyExc_ValueError, "Field %s does not have presence.",
-                 upb_fielddef_fullname(field));
+                 upb_FieldDef_FullName(field));
     return NULL;
   }
 
   if (PyUpb_CMessage_IsStub(self)) Py_RETURN_FALSE;
 
-  return PyBool_FromLong(field ? upb_msg_has(self->ptr.msg, field)
-                               : upb_msg_whichoneof(self->ptr.msg, oneof) != NULL);
+  return PyBool_FromLong(field ? upb_Message_Has(self->ptr.msg, field)
+                               : upb_Message_WhichOneof(self->ptr.msg, oneof) !=
+                                     NULL);
 }
 
 static PyObject* PyUpb_CMessage_FindInitializationErrors(PyObject* _self,
@@ -963,8 +964,8 @@
   } else {
     // We just need to return a boolean "true" or "false" for whether all
     // required fields are set.
-    const upb_msgdef* m = PyUpb_CMessage_GetMsgdef(_self);
-    const upb_symtab* symtab = upb_filedef_symtab(upb_msgdef_file(m));
+    const upb_MessageDef* m = PyUpb_CMessage_GetMsgdef(_self);
+    const upb_DefPool* symtab = upb_FileDef_Pool(upb_MessageDef_File(m));
     bool initialized = !upb_util_HasUnsetRequired(msg, m, symtab, NULL);
     return PyBool_FromLong(initialized);
   }
@@ -974,8 +975,8 @@
                                                   PyObject* val) {
   assert(PyTuple_Check(val));
   PyObject* field = PyTuple_GetItem(val, 0);
-  const upb_fielddef* f = PyUpb_FieldDescriptor_GetDef(field);
-  return PyLong_FromLong(upb_fielddef_number(f));
+  const upb_FieldDef* f = PyUpb_FieldDescriptor_GetDef(field);
+  return PyLong_FromLong(upb_FieldDef_Number(f));
 }
 
 static bool PyUpb_CMessage_SortFieldList(PyObject* list) {
@@ -993,7 +994,7 @@
   if (!call_result) goto err;
   ok = true;
 
- err:
+err:
   Py_XDECREF(method);
   Py_XDECREF(args);
   Py_XDECREF(kwargs);
@@ -1006,18 +1007,18 @@
   upb_msg* msg = PyUpb_CMessage_GetIfReified(_self);
   if (!msg) return list;
 
-  size_t iter1 = UPB_MSG_BEGIN;
-  const upb_msgdef* m = PyUpb_CMessage_GetMsgdef(_self);
-  const upb_symtab* symtab = upb_filedef_symtab(upb_msgdef_file(m));
-  const upb_fielddef* f;
+  size_t iter1 = kUpb_Message_Begin;
+  const upb_MessageDef* m = PyUpb_CMessage_GetMsgdef(_self);
+  const upb_DefPool* symtab = upb_FileDef_Pool(upb_MessageDef_File(m));
+  const upb_FieldDef* f;
   PyObject* field_desc = NULL;
   PyObject* py_val = NULL;
   PyObject* tuple = NULL;
-  upb_msgval val;
+  upb_MessageValue val;
   uint32_t last_field = 0;
   bool in_order = true;
-  while (upb_msg_next(msg, m, symtab, &f, &val, &iter1)) {
-    const uint32_t field_number = upb_fielddef_number(f);
+  while (upb_Message_Next(msg, m, symtab, &f, &val, &iter1)) {
+    const uint32_t field_number = upb_FieldDef_Number(f);
     if (field_number < last_field) in_order = false;
     last_field = field_number;
     PyObject* field_desc = PyUpb_FieldDescriptor_Get(f);
@@ -1094,11 +1095,12 @@
   }
 
   PyUpb_CMessage_EnsureReified(self);
-  const upb_msgdef* msgdef = _PyUpb_CMessage_GetMsgdef(self);
-  const upb_filedef* file = upb_msgdef_file(msgdef);
-  const upb_extreg* extreg = upb_symtab_extreg(upb_filedef_symtab(file));
-  const upb_msglayout* layout = upb_msgdef_layout(msgdef);
-  upb_arena* arena = PyUpb_Arena_Get(self->arena);
+  const upb_MessageDef* msgdef = _PyUpb_CMessage_GetMsgdef(self);
+  const upb_FileDef* file = upb_MessageDef_File(msgdef);
+  const upb_extreg* extreg =
+      upb_DefPool_ExtensionRegistry(upb_FileDef_Pool(file));
+  const upb_MiniTable* layout = upb_MessageDef_MiniTable(msgdef);
+  upb_Arena* arena = PyUpb_Arena_Get(self->arena);
   PyUpb_ModuleState* state = PyUpb_ModuleState_Get();
   int options =
       UPB_DECODE_MAXDEPTH(state->allow_oversize_protos ? UINT32_MAX : 100);
@@ -1136,7 +1138,7 @@
 
 static PyObject* PyUpb_CMessage_Clear(PyUpb_CMessage* self, PyObject* args) {
   PyUpb_CMessage_EnsureReified(self);
-  const upb_msgdef* msgdef = _PyUpb_CMessage_GetMsgdef(self);
+  const upb_MessageDef* msgdef = _PyUpb_CMessage_GetMsgdef(self);
   PyUpb_WeakMap* subobj_map = self->unset_subobj_map;
 
   if (subobj_map) {
@@ -1146,16 +1148,16 @@
     PyObject* obj;
 
     while (PyUpb_WeakMap_Next(subobj_map, &key, &obj, &iter)) {
-      const upb_fielddef* f = key;
+      const upb_FieldDef* f = key;
       PyUpb_WeakMap_DeleteIter(subobj_map, &iter);
-      if (upb_fielddef_ismap(f)) {
-        assert(upb_msg_get(msg, f).map_val == NULL);
+      if (upb_FieldDef_IsMap(f)) {
+        assert(upb_Message_Get(msg, f).map_val == NULL);
         PyUpb_MapContainer_Reify(obj, NULL);
-      } else if (upb_fielddef_isseq(f)) {
-        assert(upb_msg_get(msg, f).array_val == NULL);
+      } else if (upb_FieldDef_IsRepeated(f)) {
+        assert(upb_Message_Get(msg, f).array_val == NULL);
         PyUpb_RepeatedContainer_Reify(obj, NULL);
       } else {
-        assert(!upb_msg_has(msg, f));
+        assert(!upb_Message_Has(msg, f));
         PyUpb_CMessage* sub = (void*)obj;
         assert(self == sub->ptr.parent);
         PyUpb_CMessage_Reify(sub, f, NULL);
@@ -1163,11 +1165,11 @@
     }
   }
 
-  upb_msg_clear(self->ptr.msg, msgdef);
+  upb_Message_Clear(self->ptr.msg, msgdef);
   Py_RETURN_NONE;
 }
 
-void PyUpb_CMessage_DoClearField(PyObject* _self, const upb_fielddef* f) {
+void PyUpb_CMessage_DoClearField(PyObject* _self, const upb_FieldDef* f) {
   PyUpb_CMessage* self = (void*)_self;
   PyUpb_CMessage_EnsureReified((PyUpb_CMessage*)self);
 
@@ -1177,7 +1179,7 @@
                       ? PyUpb_WeakMap_Get(self->unset_subobj_map, f)
                       : NULL;
 
-  if (upb_fielddef_ismap(f)) {
+  if (upb_FieldDef_IsMap(f)) {
     // For maps we additionally have to invalidate any iterators.  So we need
     // to get an object even if it's reified.
     if (!sub) {
@@ -1185,24 +1187,24 @@
     }
     PyUpb_MapContainer_EnsureReified(sub);
     PyUpb_MapContainer_Invalidate(sub);
-  } else if (upb_fielddef_isseq(f)) {
+  } else if (upb_FieldDef_IsRepeated(f)) {
     if (sub) {
       PyUpb_RepeatedContainer_EnsureReified(sub);
     }
-  } else if (upb_fielddef_issubmsg(f)) {
+  } else if (upb_FieldDef_IsSubMessage(f)) {
     if (sub) {
       PyUpb_CMessage_EnsureReified((PyUpb_CMessage*)sub);
     }
   }
 
   Py_XDECREF(sub);
-  upb_msg_clearfield(self->ptr.msg, f);
+  upb_Message_ClearField(self->ptr.msg, f);
 }
 
 static PyObject* PyUpb_CMessage_ClearExtension(PyObject* _self, PyObject* arg) {
   PyUpb_CMessage* self = (void*)_self;
   PyUpb_CMessage_EnsureReified(self);
-  const upb_fielddef* f = PyUpb_CMessage_GetExtensionDef(_self, arg);
+  const upb_FieldDef* f = PyUpb_CMessage_GetExtensionDef(_self, arg);
   if (!f) return NULL;
   PyUpb_CMessage_DoClearField(_self, f);
   Py_RETURN_NONE;
@@ -1218,13 +1220,13 @@
   //   assert msg.HasField("foo")
   PyUpb_CMessage_EnsureReified(self);
 
-  const upb_fielddef* f;
-  const upb_oneofdef* o;
+  const upb_FieldDef* f;
+  const upb_OneofDef* o;
   if (!PyUpb_CMessage_LookupName(self, arg, &f, &o, PyExc_ValueError)) {
     return NULL;
   }
 
-  if (o) f = upb_msg_whichoneof(self->ptr.msg, o);
+  if (o) f = upb_Message_WhichOneof(self->ptr.msg, o);
   PyUpb_CMessage_DoClearField(_self, f);
   Py_RETURN_NONE;
 }
@@ -1232,8 +1234,8 @@
 static PyObject* PyUpb_CMessage_DiscardUnknownFields(PyUpb_CMessage* self,
                                                      PyObject* arg) {
   PyUpb_CMessage_EnsureReified(self);
-  const upb_msgdef* msgdef = _PyUpb_CMessage_GetMsgdef(self);
-  upb_msg_discardunknown(self->ptr.msg, msgdef, 64);
+  const upb_MessageDef* msgdef = _PyUpb_CMessage_GetMsgdef(self);
+  upb_Message_DiscardUnknown(self->ptr.msg, msgdef, 64);
   Py_RETURN_NONE;
 }
 
@@ -1241,8 +1243,8 @@
                                                          PyObject* arg) {
   PyUpb_CMessage* self = (void*)_self;
   upb_msg* msg = PyUpb_CMessage_GetIfReified(_self);
-  const upb_msgdef* msgdef = _PyUpb_CMessage_GetMsgdef(self);
-  const upb_symtab* ext_pool = upb_filedef_symtab(upb_msgdef_file(msgdef));
+  const upb_MessageDef* msgdef = _PyUpb_CMessage_GetMsgdef(self);
+  const upb_DefPool* ext_pool = upb_FileDef_Pool(upb_MessageDef_File(msgdef));
   upb_FieldPathEntry* fields;
   PyObject* ret = PyList_New(0);
   if (upb_util_HasUnsetRequired(msg, msgdef, ext_pool, &fields)) {
@@ -1287,43 +1289,43 @@
   goto done;
 }
 
-const upb_fielddef* PyUpb_CMessage_GetExtensionDef(PyObject* _self, PyObject* key) {
-  const upb_fielddef* f = PyUpb_FieldDescriptor_GetDef(key);
+const upb_FieldDef* PyUpb_CMessage_GetExtensionDef(PyObject* _self,
+                                                   PyObject* key) {
+  const upb_FieldDef* f = PyUpb_FieldDescriptor_GetDef(key);
   if (!f) {
     PyErr_Clear();
     PyErr_Format(PyExc_KeyError, "Object %R is not a field descriptor\n", key);
     return NULL;
   }
-  if (!upb_fielddef_isextension(f)) {
+  if (!upb_FieldDef_IsExtension(f)) {
     PyErr_Format(PyExc_KeyError, "Field %s is not an extension\n",
-                 upb_fielddef_fullname(f));
+                 upb_FieldDef_FullName(f));
     return NULL;
   }
-  const upb_msgdef* msgdef = PyUpb_CMessage_GetMsgdef(_self);
-  if (upb_fielddef_containingtype(f) != msgdef) {
+  const upb_MessageDef* msgdef = PyUpb_CMessage_GetMsgdef(_self);
+  if (upb_FieldDef_ContainingType(f) != msgdef) {
     PyErr_Format(PyExc_KeyError, "Extension doesn't match (%s vs %s)",
-                 upb_msgdef_fullname(msgdef), upb_fielddef_fullname(f));
+                 upb_MessageDef_FullName(msgdef), upb_FieldDef_FullName(f));
     return NULL;
   }
   return f;
 }
 
-
 static PyObject* PyUpb_CMessage_HasExtension(PyObject* _self,
                                              PyObject* ext_desc) {
   upb_msg* msg = PyUpb_CMessage_GetIfReified(_self);
-  const upb_fielddef* f = PyUpb_CMessage_GetExtensionDef(_self, ext_desc);
+  const upb_FieldDef* f = PyUpb_CMessage_GetExtensionDef(_self, ext_desc);
   if (!f) return NULL;
-  if (upb_fielddef_isseq(f)) {
+  if (upb_FieldDef_IsRepeated(f)) {
     PyErr_SetString(PyExc_KeyError,
                     "Field is repeated. A singular method is required.");
     return NULL;
   }
   if (!msg) Py_RETURN_FALSE;
-  return PyBool_FromLong(upb_msg_has(msg, f));
+  return PyBool_FromLong(upb_Message_Has(msg, f));
 }
 
-void PyUpb_CMessage_ReportInitializationErrors(const upb_msgdef* msgdef,
+void PyUpb_CMessage_ReportInitializationErrors(const upb_MessageDef* msgdef,
                                                PyObject* errors,
                                                PyObject* exc) {
   PyObject* comma = PyUnicode_FromString(",");
@@ -1332,7 +1334,7 @@
   missing_fields = PyUnicode_Join(comma, errors);
   if (!missing_fields) goto done;
   PyErr_Format(exc, "Message %s is missing required fields: %U",
-               upb_msgdef_fullname(msgdef), missing_fields);
+               upb_MessageDef_FullName(msgdef), missing_fields);
 done:
   Py_XDECREF(comma);
   Py_XDECREF(missing_fields);
@@ -1351,7 +1353,7 @@
     return NULL;
   }
 
-  const upb_msgdef* msgdef = _PyUpb_CMessage_GetMsgdef(self);
+  const upb_MessageDef* msgdef = _PyUpb_CMessage_GetMsgdef(self);
   if (PyUpb_CMessage_IsStub(self)) {
     // Nothing to serialize, but we do have to check whether the message is
     // initialized.
@@ -1367,14 +1369,14 @@
     return NULL;
   }
 
-  upb_arena* arena = upb_arena_new();
-  const upb_msglayout* layout = upb_msgdef_layout(msgdef);
+  upb_Arena* arena = upb_Arena_New();
+  const upb_MiniTable* layout = upb_MessageDef_MiniTable(msgdef);
   size_t size = 0;
   // Python does not currently have any effective limit on serialization depth.
   int options = UPB_ENCODE_MAXDEPTH(UINT32_MAX);
-  if (check_required) options |= UPB_ENCODE_CHECKREQUIRED;
-  if (deterministic) options |= UPB_ENCODE_DETERMINISTIC;
-  char* pb = upb_encode_ex(self->ptr.msg, layout, options, arena, &size);
+  if (check_required) options |= kUpb_Encode_CheckRequired;
+  if (deterministic) options |= kUpb_Encode_Deterministic;
+  char* pb = upb_EncodeEx(self->ptr.msg, layout, options, arena, &size);
   PyObject* ret = NULL;
 
   if (!pb) {
@@ -1392,7 +1394,7 @@
   ret = PyBytes_FromStringAndSize(pb, size);
 
 done:
-  upb_arena_free(arena);
+  upb_Arena_Free(arena);
   return ret;
 }
 
@@ -1409,15 +1411,15 @@
 
 static PyObject* PyUpb_CMessage_WhichOneof(PyObject* _self, PyObject* name) {
   PyUpb_CMessage* self = (void*)_self;
-  const upb_oneofdef* o;
+  const upb_OneofDef* o;
   if (!PyUpb_CMessage_LookupName(self, name, NULL, &o, PyExc_ValueError)) {
     return NULL;
   }
   upb_msg* msg = PyUpb_CMessage_GetIfReified(_self);
   if (!msg) Py_RETURN_NONE;
-  const upb_fielddef* f = upb_msg_whichoneof(msg, o);
+  const upb_FieldDef* f = upb_Message_WhichOneof(msg, o);
   if (!f) Py_RETURN_NONE;
-  return PyUnicode_FromString(upb_fielddef_name(f));
+  return PyUnicode_FromString(upb_FieldDef_Name(f));
 }
 
 void PyUpb_CMessage_ClearExtensionDict(PyObject* _self) {
@@ -1433,8 +1435,8 @@
     return self->ext_dict;
   }
 
-  const upb_msgdef* m = _PyUpb_CMessage_GetMsgdef(self);
-  if (upb_msgdef_extrangecount(m) == 0) {
+  const upb_MessageDef* m = _PyUpb_CMessage_GetMsgdef(self);
+  if (upb_MessageDef_ExtensionRangeCount(m) == 0) {
     PyErr_SetNone(PyExc_AttributeError);
     return NULL;
   }
@@ -1544,7 +1546,7 @@
 // to simplify this, so that the illustration above is indeed accurate).
 
 typedef struct {
-  const upb_msglayout* layout;
+  const upb_MiniTable* layout;
   PyObject* py_message_descriptor;
 } PyUpb_MessageMeta;
 
@@ -1559,7 +1561,7 @@
   return (PyUpb_MessageMeta*)((char*)cls + cpython_bits.type_basicsize);
 }
 
-static const upb_msgdef* PyUpb_MessageMeta_GetMsgdef(PyObject* cls) {
+static const upb_MessageDef* PyUpb_MessageMeta_GetMsgdef(PyObject* cls) {
   PyUpb_MessageMeta* self = PyUpb_GetMessageMeta(cls);
   return PyUpb_Descriptor_GetDef(self->py_message_descriptor);
 }
@@ -1572,9 +1574,9 @@
     return PyErr_Format(PyExc_TypeError, "Expected a message Descriptor");
   }
 
-  const upb_msgdef* msgdef = PyUpb_Descriptor_GetDef(py_descriptor);
+  const upb_MessageDef* msgdef = PyUpb_Descriptor_GetDef(py_descriptor);
   assert(msgdef);
-  assert(!PyUpb_ObjCache_Get(upb_msgdef_layout(msgdef)));
+  assert(!PyUpb_ObjCache_Get(upb_MessageDef_MiniTable(msgdef)));
 
   PyObject* slots = PyTuple_New(0);
   if (PyDict_SetItemString(dict, "__slots__", slots) < 0) {
@@ -1586,7 +1588,7 @@
   //    (CMessage, Message, WktBase)   # For well-known types
   PyObject* wkt_bases = PyUpb_GetWktBases(state);
   PyObject* wkt_base =
-      PyDict_GetItemString(wkt_bases, upb_msgdef_fullname(msgdef));
+      PyDict_GetItemString(wkt_bases, upb_MessageDef_FullName(msgdef));
   PyObject* args;
   if (wkt_base == NULL) {
     args = Py_BuildValue("s(OO)O", name, state->cmessage_type,
@@ -1602,10 +1604,10 @@
 
   PyUpb_MessageMeta* meta = PyUpb_GetMessageMeta(ret);
   meta->py_message_descriptor = py_descriptor;
-  meta->layout = upb_msgdef_layout(msgdef);
+  meta->layout = upb_MessageDef_MiniTable(msgdef);
   Py_INCREF(meta->py_message_descriptor);
 
-  PyUpb_ObjCache_Add(upb_msgdef_layout(msgdef), ret);
+  PyUpb_ObjCache_Add(upb_MessageDef_MiniTable(msgdef), ret);
 
   return ret;
 }
@@ -1641,8 +1643,8 @@
     return NULL;
   }
 
-  const upb_msgdef* m = PyUpb_Descriptor_GetDef(py_descriptor);
-  PyObject* ret = PyUpb_ObjCache_Get(upb_msgdef_layout(m));
+  const upb_MessageDef* m = PyUpb_Descriptor_GetDef(py_descriptor);
+  PyObject* ret = PyUpb_ObjCache_Get(upb_MessageDef_MiniTable(m));
   if (ret) return ret;
   return PyUpb_MessageMeta_DoCreateClass(py_descriptor, name, dict);
 }
@@ -1654,11 +1656,11 @@
   PyUpb_Dealloc(self);
 }
 
-void PyUpb_MessageMeta_AddFieldNumber(PyObject* self, const upb_fielddef* f) {
+void PyUpb_MessageMeta_AddFieldNumber(PyObject* self, const upb_FieldDef* f) {
   PyObject* name =
-      PyUnicode_FromFormat("%s_FIELD_NUMBER", upb_fielddef_name(f));
+      PyUnicode_FromFormat("%s_FIELD_NUMBER", upb_FieldDef_Name(f));
   PyObject* upper = PyObject_CallMethod(name, "upper", "");
-  PyObject_SetAttr(self, upper, PyLong_FromLong(upb_fielddef_number(f)));
+  PyObject_SetAttr(self, upper, PyLong_FromLong(upb_FieldDef_Number(f)));
   Py_DECREF(name);
   Py_DECREF(upper);
 }
@@ -1666,48 +1668,49 @@
 static PyObject* PyUpb_MessageMeta_GetDynamicAttr(PyObject* self,
                                                   PyObject* name) {
   const char* name_buf = PyUpb_GetStrData(name);
-  const upb_msgdef* msgdef = PyUpb_MessageMeta_GetMsgdef(self);
-  const upb_filedef* filedef = upb_msgdef_file(msgdef);
-  const upb_symtab* symtab = upb_filedef_symtab(filedef);
+  const upb_MessageDef* msgdef = PyUpb_MessageMeta_GetMsgdef(self);
+  const upb_FileDef* filedef = upb_MessageDef_File(msgdef);
+  const upb_DefPool* symtab = upb_FileDef_Pool(filedef);
 
   PyObject* py_key =
-      PyBytes_FromFormat("%s.%s", upb_msgdef_fullname(msgdef), name_buf);
+      PyBytes_FromFormat("%s.%s", upb_MessageDef_FullName(msgdef), name_buf);
   const char* key = PyUpb_GetStrData(py_key);
   PyObject* ret = NULL;
-  const upb_msgdef* nested = upb_symtab_lookupmsg(symtab, key);
-  const upb_enumdef* enumdef;
-  const upb_enumvaldef* enumval;
-  const upb_fielddef* ext;
+  const upb_MessageDef* nested = upb_DefPool_FindMessageByName(symtab, key);
+  const upb_EnumDef* enumdef;
+  const upb_EnumValueDef* enumval;
+  const upb_FieldDef* ext;
 
   if (nested) {
     ret = PyUpb_Descriptor_GetClass(nested);
-  } else if ((enumdef = upb_symtab_lookupenum(symtab, key))) {
+  } else if ((enumdef = upb_DefPool_FindEnumByName(symtab, key))) {
     PyUpb_ModuleState* state = PyUpb_ModuleState_Get();
     PyObject* klass = state->enum_type_wrapper_class;
     ret = PyUpb_EnumDescriptor_Get(enumdef);
     ret = PyObject_CallFunctionObjArgs(klass, ret, NULL);
-  } else if ((enumval = upb_symtab_lookupenumval(symtab, key))) {
-    ret = PyLong_FromLong(upb_enumvaldef_number(enumval));
-  } else if ((ext = upb_symtab_lookupext(symtab, key))) {
+  } else if ((enumval = upb_DefPool_FindEnumByNameval(symtab, key))) {
+    ret = PyLong_FromLong(upb_EnumValueDef_Number(enumval));
+  } else if ((ext = upb_DefPool_FindExtensionByName(symtab, key))) {
     ret = PyUpb_FieldDescriptor_Get(ext);
   }
 
   Py_DECREF(py_key);
 
-  const char* suffix =  "_FIELD_NUMBER";
+  const char* suffix = "_FIELD_NUMBER";
   size_t n = strlen(name_buf);
   size_t suffix_n = strlen(suffix);
   if (n > suffix_n && memcmp(suffix, name_buf + n - suffix_n, suffix_n) == 0) {
     // We can't look up field names dynamically, because the <NAME>_FIELD_NUMBER
     // naming scheme upper-cases the field name and is therefore non-reversible.
     // So we just add all field numbers.
-    int n = upb_msgdef_fieldcount(msgdef);
+    int n = upb_MessageDef_FieldCount(msgdef);
     for (int i = 0; i < n; i++) {
-      PyUpb_MessageMeta_AddFieldNumber(self, upb_msgdef_field(msgdef, i));
+      PyUpb_MessageMeta_AddFieldNumber(self, upb_MessageDef_Field(msgdef, i));
     }
-    n = upb_msgdef_nestedextcount(msgdef);
+    n = upb_MessageDef_NestedExtensionCount(msgdef);
     for (int i = 0; i < n; i++) {
-      PyUpb_MessageMeta_AddFieldNumber(self, upb_msgdef_nestedext(msgdef, i));
+      PyUpb_MessageMeta_AddFieldNumber(
+          self, upb_MessageDef_NestedExtension(msgdef, i));
     }
     ret = PyObject_GenericGetAttr(self, name);
   }
@@ -1772,8 +1775,8 @@
 
   if (!state->cmessage_type || !state->message_meta_type) return false;
   if (PyModule_AddObject(m, "MessageMeta", message_meta_type)) return false;
-  state->listfields_item_key =
-      PyObject_GetAttrString((PyObject*)state->cmessage_type, "_ListFieldsItemKey");
+  state->listfields_item_key = PyObject_GetAttrString(
+      (PyObject*)state->cmessage_type, "_ListFieldsItemKey");
 
   PyObject* mod = PyImport_ImportModule("google.protobuf.message");
   if (mod == NULL) return false;
