upb: clean up and consolidate the upb/message/ build targets

PiperOrigin-RevId: 594514934
diff --git a/protos/BUILD b/protos/BUILD
index f903249..0167b19 100644
--- a/protos/BUILD
+++ b/protos/BUILD
@@ -35,7 +35,6 @@
         "//upb:mem",
         "//upb:message",
         "//upb:message_copy",
-        "//upb:message_types",
         "@com_google_absl//absl/base:core_headers",
         "@com_google_absl//absl/strings",
     ],
@@ -59,10 +58,10 @@
         "//upb:message_accessors",
         "//upb:message_copy",
         "//upb:message_promote",
-        "//upb:message_types",
         "//upb:mini_table",
         "//upb:wire",
         "//upb:wire_reader",
+        "//upb/message:internal",
         "@com_google_absl//absl/status",
         "@com_google_absl//absl/status:statusor",
         "@com_google_absl//absl/strings",
diff --git a/protos/protos.cc b/protos/protos.cc
index 57570e4..6522405 100644
--- a/protos/protos.cc
+++ b/protos/protos.cc
@@ -18,8 +18,8 @@
 #include "upb/mem/arena.h"
 #include "upb/message/copy.h"
 #include "upb/message/internal/extension.h"
+#include "upb/message/message.h"
 #include "upb/message/promote.h"
-#include "upb/message/types.h"
 #include "upb/mini_table/extension.h"
 #include "upb/mini_table/extension_registry.h"
 #include "upb/mini_table/message.h"
diff --git a/protos/repeated_field.h b/protos/repeated_field.h
index 6d37b56..f8f3f5a 100644
--- a/protos/repeated_field.h
+++ b/protos/repeated_field.h
@@ -22,7 +22,7 @@
 #include "upb/mem/arena.h"
 #include "upb/message/array.h"
 #include "upb/message/copy.h"
-#include "upb/message/types.h"
+#include "upb/message/message.h"
 
 namespace protos {
 namespace internal {
diff --git a/protos/repeated_field_iterator.h b/protos/repeated_field_iterator.h
index 79c284c..27af26b 100644
--- a/protos/repeated_field_iterator.h
+++ b/protos/repeated_field_iterator.h
@@ -18,7 +18,7 @@
 #include "upb/base/string_view.h"
 #include "upb/mem/arena.h"
 #include "upb/message/array.h"
-#include "upb/message/types.h"
+#include "upb/message/message.h"
 
 namespace protos {
 namespace internal {
diff --git a/upb/BUILD b/upb/BUILD
index 1304764..eff6314 100644
--- a/upb/BUILD
+++ b/upb/BUILD
@@ -115,6 +115,7 @@
         ":mini_descriptor",
         ":mini_table",
         ":wire",
+        "//upb/message:internal",
     ],
 )
 
@@ -229,24 +230,6 @@
 )
 
 alias(
-    name = "message_tagged_ptr",
-    actual = "//upb/message:tagged_ptr",
-    visibility = ["//upb:friends"],
-)
-
-alias(
-    name = "message_types",
-    actual = "//upb/message:types",
-    visibility = ["//visibility:public"],
-)
-
-alias(
-    name = "message_value",
-    actual = "//upb/message:value",
-    visibility = ["//visibility:public"],
-)
-
-alias(
     name = "mini_descriptor",
     actual = "//upb/mini_descriptor",
     visibility = ["//visibility:public"],
@@ -357,9 +340,6 @@
         ":message_accessors",
         ":message_compare",
         ":message_copy",
-        ":message_tagged_ptr",
-        ":message_types",
-        ":message_value",
         ":mini_descriptor",
         ":mini_table",
         ":mini_table_compat",
@@ -370,6 +350,7 @@
         ":wire_reader",
         "//upb/base:internal",
         "//upb/mem:internal",
+        "//upb/message:internal",
         "//upb/mini_descriptor:internal",
         "//upb/mini_table:internal",
     ],
@@ -405,9 +386,6 @@
         ":message_accessors",
         ":message_compare",
         ":message_copy",
-        ":message_tagged_ptr",
-        ":message_types",
-        ":message_value",
         ":mini_descriptor",
         ":mini_table",
         ":mini_table_compat",
@@ -418,6 +396,7 @@
         ":wire_reader",
         "//upb/base:internal",
         "//upb/mem:internal",
+        "//upb/message:internal",
         "//upb/mini_descriptor:internal",
         "//upb/mini_table:internal",
     ],
@@ -454,9 +433,6 @@
         ":message_accessors",
         ":message_compare",
         ":message_copy",
-        ":message_tagged_ptr",
-        ":message_types",
-        ":message_value",
         ":mini_descriptor",
         ":mini_table",
         ":mini_table_compat",
@@ -467,6 +443,7 @@
         ":wire_reader",
         "//upb/base:internal",
         "//upb/mem:internal",
+        "//upb/message:internal",
         "//upb/mini_descriptor:internal",
         "//upb/mini_table:internal",
     ],
diff --git a/upb/json/BUILD b/upb/json/BUILD
index 6331725..d10498f 100644
--- a/upb/json/BUILD
+++ b/upb/json/BUILD
@@ -24,7 +24,6 @@
         "//upb:lex",
         "//upb:mem",
         "//upb:message",
-        "//upb:message_types",
         "//upb:mini_table",
         "//upb:port",
         "//upb:reflection",
@@ -103,7 +102,6 @@
 #         "//upb:base",
 #         "//upb:mem",
 #         "//upb:message",
-#         "//upb:message_types",
 #         "//upb:mini_table",
 #         "//upb:reflection",
 #     ],
diff --git a/upb/json/decode.c b/upb/json/decode.c
index 531e937..66f0929 100644
--- a/upb/json/decode.c
+++ b/upb/json/decode.c
@@ -28,7 +28,6 @@
 #include "upb/message/array.h"
 #include "upb/message/map.h"
 #include "upb/message/message.h"
-#include "upb/message/types.h"
 #include "upb/mini_table/message.h"
 #include "upb/reflection/def.h"
 #include "upb/reflection/message.h"
diff --git a/upb/message/BUILD b/upb/message/BUILD
index 969b2ec..1b10994 100644
--- a/upb/message/BUILD
+++ b/upb/message/BUILD
@@ -17,20 +17,77 @@
 )
 
 cc_library(
+    name = "message",
+    srcs = [
+        "array.c",
+        "compat.c",
+        "map.c",
+        "map_sorter.c",
+        "message.c",
+    ],
+    hdrs = [
+        "array.h",
+        "compat.h",
+        "map.h",
+        "map_gencode_util.h",
+        "message.h",
+        "tagged_ptr.h",
+        "value.h",
+    ],
+    copts = UPB_DEFAULT_COPTS,
+    visibility = ["//visibility:public"],
+    deps = [
+        ":internal",
+        "//upb:base",
+        "//upb:mem",
+        "//upb:mini_table",
+        "//upb:port",
+        "//upb/base:internal",
+        "//upb/mini_table:internal",
+    ],
+)
+
+cc_library(
+    name = "internal",
+    srcs = [
+        "internal/extension.c",
+        "internal/message.c",
+    ],
+    hdrs = [
+        "internal/accessors.h",
+        "internal/array.h",
+        "internal/extension.h",
+        "internal/map.h",
+        "internal/map_entry.h",
+        "internal/map_sorter.h",
+        "internal/message.h",
+        "internal/tagged_ptr.h",
+    ],
+    copts = UPB_DEFAULT_COPTS,
+    visibility = ["//visibility:public"],
+    deps = [
+        "//upb:base",
+        "//upb:hash",
+        "//upb:mem",
+        "//upb:mini_table",
+        "//upb:port",
+        "//upb/base:internal",
+    ],
+)
+
+cc_library(
     name = "accessors",
     srcs = [
         "accessors.c",
     ],
     hdrs = [
         "accessors.h",
-        "internal/accessors.h",
     ],
     copts = UPB_DEFAULT_COPTS,
     visibility = ["//visibility:public"],
     deps = [
+        ":internal",
         ":message",
-        ":tagged_ptr",
-        ":types",
         "//upb:base",
         "//upb:mem",
         "//upb:mini_table",
@@ -50,7 +107,6 @@
     visibility = ["//visibility:public"],
     deps = [
         ":message",
-        ":types",
         "//upb:mem",
         "//upb:mini_table",
         "//upb:port",
@@ -70,52 +126,12 @@
     visibility = ["//visibility:public"],
     deps = [
         ":accessors",
+        ":internal",
         ":message",
-        ":tagged_ptr",
-        ":types",
         "//upb:base",
         "//upb:mem",
         "//upb:mini_table",
         "//upb:port",
-        "//upb/mini_table:internal",
-    ],
-)
-
-cc_library(
-    name = "message",
-    srcs = [
-        "array.c",
-        "compat.c",
-        "internal/extension.c",
-        "internal/message.c",
-        "map.c",
-        "map_sorter.c",
-        "message.c",
-    ],
-    hdrs = [
-        "array.h",
-        "compat.h",
-        "internal/array.h",
-        "internal/extension.h",
-        "internal/map.h",
-        "internal/map_entry.h",
-        "internal/map_sorter.h",
-        "internal/message.h",
-        "internal/types.h",
-        "map.h",
-        "map_gencode_util.h",
-        "message.h",
-    ],
-    copts = UPB_DEFAULT_COPTS,
-    visibility = ["//visibility:public"],
-    deps = [
-        ":types",
-        ":value",
-        "//upb:base",
-        "//upb:hash",
-        "//upb:mem",
-        "//upb:mini_table",
-        "//upb:port",
         "//upb/base:internal",
         "//upb/mini_table:internal",
     ],
@@ -133,9 +149,8 @@
     visibility = ["//visibility:public"],
     deps = [
         ":accessors",
+        ":internal",
         ":message",
-        ":tagged_ptr",
-        ":types",
         "//upb:base",
         "//upb:eps_copy_input_stream",
         "//upb:mem",
@@ -161,41 +176,6 @@
     ],
 )
 
-cc_library(
-    name = "tagged_ptr",
-    hdrs = ["tagged_ptr.h"],
-    copts = UPB_DEFAULT_COPTS,
-    visibility = ["//visibility:public"],
-    deps = [
-        ":types",
-        "//upb:port",
-    ],
-)
-
-cc_library(
-    name = "types",
-    hdrs = [
-        "types.h",
-    ],
-    copts = UPB_DEFAULT_COPTS,
-    visibility = ["//visibility:public"],
-    deps = [],
-)
-
-cc_library(
-    name = "value",
-    hdrs = [
-        "value.h",
-    ],
-    copts = UPB_DEFAULT_COPTS,
-    visibility = ["//visibility:public"],
-    deps = [
-        ":tagged_ptr",
-        ":types",
-        "//upb:base",
-    ],
-)
-
 proto_library(
     name = "message_test_proto",
     testonly = 1,
@@ -264,6 +244,7 @@
     deps = [
         ":accessors",
         ":copy",
+        ":internal",
         ":message",
         "//:protobuf",
         "//upb:base",
@@ -298,9 +279,9 @@
     deps = [
         ":accessors",
         ":copy",
+        ":internal",
         ":message",
         ":promote",
-        ":tagged_ptr",
         "//:protobuf",
         "//upb:base",
         "//upb:mem",
@@ -324,14 +305,14 @@
     name = "test",
     srcs = ["test.cc"],
     deps = [
+        ":internal",
+        ":message",
         ":message_test_upb_minitable_proto",
         ":message_test_upb_proto",
         ":message_test_upb_proto_reflection",
-        ":value",
         "//upb:base",
         "//upb:json",
         "//upb:mem",
-        "//upb:message",
         "//upb:mini_table",
         "//upb:reflection",
         "//upb:wire",
diff --git a/upb/message/accessors.h b/upb/message/accessors.h
index ac5788e..e55781c 100644
--- a/upb/message/accessors.h
+++ b/upb/message/accessors.h
@@ -20,10 +20,10 @@
 #include "upb/message/internal/array.h"
 #include "upb/message/internal/map.h"
 #include "upb/message/internal/message.h"
-#include "upb/message/internal/types.h"
+#include "upb/message/internal/tagged_ptr.h"
 #include "upb/message/map.h"
 #include "upb/message/tagged_ptr.h"
-#include "upb/message/types.h"
+#include "upb/message/value.h"
 #include "upb/mini_table/enum.h"
 #include "upb/mini_table/sub.h"
 
@@ -352,7 +352,8 @@
                                            const upb_MiniTableField* field,
                                            upb_Message* sub_message) {
   _upb_Message_SetTaggedMessagePtr(
-      msg, mini_table, field, _upb_TaggedMessagePtr_Pack(sub_message, false));
+      msg, mini_table, field,
+      UPB_PRIVATE(_upb_TaggedMessagePtr_Pack)(sub_message, false));
 }
 
 UPB_API_INLINE upb_Message* upb_Message_GetOrCreateMutableMessage(
diff --git a/upb/message/array.h b/upb/message/array.h
index 62500f0..b217bfb 100644
--- a/upb/message/array.h
+++ b/upb/message/array.h
@@ -12,7 +12,7 @@
 
 #include "upb/base/descriptor_constants.h"
 #include "upb/mem/arena.h"
-#include "upb/message/value.h"  // IWYU pragma: export
+#include "upb/message/value.h"
 
 // Must be last.
 #include "upb/port/def.inc"
diff --git a/upb/message/compare.h b/upb/message/compare.h
index 98d165c..db7e20a 100644
--- a/upb/message/compare.h
+++ b/upb/message/compare.h
@@ -8,7 +8,7 @@
 #ifndef UPB_MESSAGE_COMPARE_H_
 #define UPB_MESSAGE_COMPARE_H_
 
-#include "upb/message/types.h"
+#include "upb/message/message.h"
 #include "upb/mini_table/message.h"
 
 // Must be last.
diff --git a/upb/message/copy.c b/upb/message/copy.c
index 9ee6be7..9342293 100644
--- a/upb/message/copy.c
+++ b/upb/message/copy.c
@@ -24,6 +24,7 @@
 #include "upb/message/tagged_ptr.h"
 #include "upb/mini_table/extension.h"
 #include "upb/mini_table/field.h"
+#include "upb/mini_table/internal/field.h"
 #include "upb/mini_table/internal/size_log2.h"
 #include "upb/mini_table/message.h"
 #include "upb/mini_table/sub.h"
@@ -74,9 +75,9 @@
       if (is_empty) sub = UPB_PRIVATE(_upb_MiniTable_Empty)();
       UPB_ASSERT(source);
       upb_Message* clone = upb_Message_DeepClone(
-          _upb_TaggedMessagePtr_GetMessage(source), sub, arena);
+          UPB_PRIVATE(_upb_TaggedMessagePtr_GetMessage)(source), sub, arena);
       *(upb_TaggedMessagePtr*)value =
-          _upb_TaggedMessagePtr_Pack(clone, is_empty);
+          UPB_PRIVATE(_upb_TaggedMessagePtr_Pack)(clone, is_empty);
       return clone != NULL;
     } break;
   }
@@ -199,7 +200,7 @@
           upb_TaggedMessagePtr tagged =
               upb_Message_GetTaggedMessagePtr(src, field, NULL);
           const upb_Message* sub_message =
-              _upb_TaggedMessagePtr_GetMessage(tagged);
+              UPB_PRIVATE(_upb_TaggedMessagePtr_GetMessage)(tagged);
           if (sub_message != NULL) {
             // If the message is currently in an unlinked, "empty" state we keep
             // it that way, because we don't want to deal with decode options,
@@ -215,7 +216,8 @@
             }
             _upb_Message_SetTaggedMessagePtr(
                 dst, mini_table, field,
-                _upb_TaggedMessagePtr_Pack(dst_sub_message, is_empty));
+                UPB_PRIVATE(_upb_TaggedMessagePtr_Pack)(dst_sub_message,
+                                                        is_empty));
           }
         } break;
         case kUpb_CType_String:
diff --git a/upb/message/copy.h b/upb/message/copy.h
index 17f82d8..33fe537 100644
--- a/upb/message/copy.h
+++ b/upb/message/copy.h
@@ -11,6 +11,7 @@
 #include "upb/mem/arena.h"
 #include "upb/message/array.h"
 #include "upb/message/map.h"
+#include "upb/message/message.h"
 #include "upb/mini_table/message.h"
 
 // Must be last.
diff --git a/upb/message/internal/accessors.h b/upb/message/internal/accessors.h
index 191df05..2c585cd 100644
--- a/upb/message/internal/accessors.h
+++ b/upb/message/internal/accessors.h
@@ -17,8 +17,7 @@
 #include "upb/message/internal/extension.h"
 #include "upb/message/internal/map.h"
 #include "upb/message/internal/message.h"
-#include "upb/message/internal/types.h"
-#include "upb/message/tagged_ptr.h"
+#include "upb/message/internal/tagged_ptr.h"
 #include "upb/mini_table/extension.h"
 #include "upb/mini_table/field.h"
 
@@ -52,7 +51,7 @@
 // Hasbit access ///////////////////////////////////////////////////////////////
 
 UPB_INLINE bool UPB_PRIVATE(_upb_Message_GetHasbit)(
-    const upb_Message* msg, const upb_MiniTableField* f) {
+    const struct upb_Message* msg, const upb_MiniTableField* f) {
   const size_t offset = UPB_PRIVATE(_upb_MiniTableField_HasbitOffset)(f);
   const char mask = UPB_PRIVATE(_upb_MiniTableField_HasbitMask)(f);
 
@@ -60,7 +59,7 @@
 }
 
 UPB_INLINE void UPB_PRIVATE(_upb_Message_SetHasbit)(
-    const upb_Message* msg, const upb_MiniTableField* f) {
+    const struct upb_Message* msg, const upb_MiniTableField* f) {
   const size_t offset = UPB_PRIVATE(_upb_MiniTableField_HasbitOffset)(f);
   const char mask = UPB_PRIVATE(_upb_MiniTableField_HasbitMask)(f);
 
@@ -68,7 +67,7 @@
 }
 
 UPB_INLINE void UPB_PRIVATE(_upb_Message_ClearHasbit)(
-    const upb_Message* msg, const upb_MiniTableField* f) {
+    const struct upb_Message* msg, const upb_MiniTableField* f) {
   const size_t offset = UPB_PRIVATE(_upb_MiniTableField_HasbitOffset)(f);
   const char mask = UPB_PRIVATE(_upb_MiniTableField_HasbitMask)(f);
 
@@ -78,18 +77,18 @@
 // Oneof case access ///////////////////////////////////////////////////////////
 
 UPB_INLINE uint32_t* UPB_PRIVATE(_upb_Message_OneofCasePtr)(
-    upb_Message* msg, const upb_MiniTableField* f) {
+    struct upb_Message* msg, const upb_MiniTableField* f) {
   return UPB_PTR_AT(msg, UPB_PRIVATE(_upb_MiniTableField_OneofOffset)(f),
                     uint32_t);
 }
 
 UPB_INLINE uint32_t UPB_PRIVATE(_upb_Message_GetOneofCase)(
-    const upb_Message* msg, const upb_MiniTableField* f) {
-  return *UPB_PRIVATE(_upb_Message_OneofCasePtr)((upb_Message*)msg, f);
+    const struct upb_Message* msg, const upb_MiniTableField* f) {
+  return *UPB_PRIVATE(_upb_Message_OneofCasePtr)((struct upb_Message*)msg, f);
 }
 
 UPB_INLINE void UPB_PRIVATE(_upb_Message_SetOneofCase)(
-    upb_Message* msg, const upb_MiniTableField* f) {
+    struct upb_Message* msg, const upb_MiniTableField* f) {
   *UPB_PRIVATE(_upb_Message_OneofCasePtr)(msg, f) =
       upb_MiniTableField_Number(f);
 }
@@ -98,18 +97,18 @@
 
 // LINT.ThenChange(GoogleInternalName2)
 
-UPB_INLINE void* _upb_MiniTableField_GetPtr(upb_Message* msg,
+UPB_INLINE void* _upb_MiniTableField_GetPtr(struct upb_Message* msg,
                                             const upb_MiniTableField* field) {
   return (char*)msg + field->UPB_ONLYBITS(offset);
 }
 
 UPB_INLINE const void* _upb_MiniTableField_GetConstPtr(
-    const upb_Message* msg, const upb_MiniTableField* field) {
+    const struct upb_Message* msg, const upb_MiniTableField* field) {
   return (char*)msg + field->UPB_ONLYBITS(offset);
 }
 
 UPB_INLINE void UPB_PRIVATE(_upb_Message_SetPresence)(
-    upb_Message* msg, const upb_MiniTableField* field) {
+    struct upb_Message* msg, const upb_MiniTableField* field) {
   if (field->presence > 0) {
     UPB_PRIVATE(_upb_Message_SetHasbit)(msg, field);
   } else if (upb_MiniTableField_IsInOneof(field)) {
@@ -195,13 +194,13 @@
 // returned bool value may be ignored since it will always succeed.
 
 UPB_INLINE bool _upb_Message_HasExtensionField(
-    const upb_Message* msg, const upb_MiniTableExtension* ext) {
+    const struct upb_Message* msg, const upb_MiniTableExtension* ext) {
   UPB_ASSERT(upb_MiniTableField_HasPresence(&ext->UPB_PRIVATE(field)));
   return _upb_Message_Getext(msg, ext) != NULL;
 }
 
 UPB_INLINE bool _upb_Message_HasNonExtensionField(
-    const upb_Message* msg, const upb_MiniTableField* field) {
+    const struct upb_Message* msg, const upb_MiniTableField* field) {
   UPB_ASSERT(upb_MiniTableField_HasPresence(field));
   UPB_ASSUME(!upb_MiniTableField_IsExtension(field));
   if (upb_MiniTableField_IsInOneof(field)) {
@@ -213,7 +212,7 @@
 }
 
 static UPB_FORCEINLINE void _upb_Message_GetNonExtensionField(
-    const upb_Message* msg, const upb_MiniTableField* field,
+    const struct upb_Message* msg, const upb_MiniTableField* field,
     const void* default_val, void* val) {
   UPB_ASSUME(!upb_MiniTableField_IsExtension(field));
   if ((upb_MiniTableField_IsInOneof(field) ||
@@ -227,7 +226,7 @@
 }
 
 UPB_INLINE void _upb_Message_GetExtensionField(
-    const upb_Message* msg, const upb_MiniTableExtension* mt_ext,
+    const struct upb_Message* msg, const upb_MiniTableExtension* mt_ext,
     const void* default_val, void* val) {
   const struct upb_Extension* ext = _upb_Message_Getext(msg, mt_ext);
   const upb_MiniTableField* f = &mt_ext->UPB_PRIVATE(field);
@@ -240,35 +239,8 @@
   }
 }
 
-// Gets a mutable Array, Map or Message field.
-// NOTE: For repeated/map fields, the resulting upb_Array*/upb_Map* can
-// be NULL if a upb_Array/upb_Map has not been allocated yet. Array/map
-// fields do not have presence, so this is semantically identical to a
-// pointer to an empty array/map, and must be treated the same for all
-// semantic purposes.
-//
-// For message fields, the pointer is guaranteed to be NULL iff the field
-// is unset (as message fields do have presence).
-UPB_INLINE upb_MutableMessageValue _upb_Message_GetMutableField(
-    const upb_Message* msg, const upb_MiniTableField* field) {
-  UPB_ASSUME(!upb_MiniTableField_IsScalar(field) ||
-             upb_MiniTableField_IsSubMessage(field));
-
-  upb_MutableMessageValue default_val;
-  default_val.msg = NULL;
-
-  upb_MutableMessageValue ret;
-  if (upb_MiniTableField_IsExtension(field)) {
-    _upb_Message_GetExtensionField(msg, (upb_MiniTableExtension*)field,
-                                   &default_val, &ret);
-  } else {
-    _upb_Message_GetNonExtensionField(msg, field, &default_val, &ret);
-  }
-  return ret;
-}
-
 UPB_INLINE void _upb_Message_SetNonExtensionField(
-    upb_Message* msg, const upb_MiniTableField* field, const void* val) {
+    struct upb_Message* msg, const upb_MiniTableField* field, const void* val) {
   UPB_ASSUME(!upb_MiniTableField_IsExtension(field));
   UPB_PRIVATE(_upb_Message_SetPresence)(msg, field);
   UPB_PRIVATE(_upb_MiniTableField_DataCopy)
@@ -276,8 +248,8 @@
 }
 
 UPB_INLINE bool _upb_Message_SetExtensionField(
-    upb_Message* msg, const upb_MiniTableExtension* mt_ext, const void* val,
-    upb_Arena* a) {
+    struct upb_Message* msg, const upb_MiniTableExtension* mt_ext,
+    const void* val, upb_Arena* a) {
   UPB_ASSERT(a);
   struct upb_Extension* ext = _upb_Message_GetOrCreateExtension(msg, mt_ext, a);
   if (!ext) return false;
@@ -287,7 +259,7 @@
 }
 
 UPB_INLINE void _upb_Message_ClearExtensionField(
-    upb_Message* msg, const upb_MiniTableExtension* ext_l) {
+    struct upb_Message* msg, const upb_MiniTableExtension* ext_l) {
   upb_Message_Internal* in = upb_Message_Getinternal(msg);
   if (!in->internal) return;
   const struct upb_Extension* base =
@@ -301,7 +273,7 @@
 }
 
 UPB_INLINE void _upb_Message_ClearNonExtensionField(
-    upb_Message* msg, const upb_MiniTableField* field) {
+    struct upb_Message* msg, const upb_MiniTableField* field) {
   if (field->presence > 0) {
     UPB_PRIVATE(_upb_Message_ClearHasbit)(msg, field);
   } else if (upb_MiniTableField_IsInOneof(field)) {
@@ -315,19 +287,19 @@
 }
 
 UPB_INLINE void _upb_Message_AssertMapIsUntagged(
-    const upb_Message* msg, const upb_MiniTableField* field) {
+    const struct upb_Message* msg, const upb_MiniTableField* field) {
   UPB_UNUSED(msg);
   UPB_PRIVATE(_upb_MiniTableField_CheckIsMap)(field);
 #ifndef NDEBUG
   upb_TaggedMessagePtr default_val = 0;
   upb_TaggedMessagePtr tagged;
   _upb_Message_GetNonExtensionField(msg, field, &default_val, &tagged);
-  UPB_ASSERT(!upb_TaggedMessagePtr_IsEmpty(tagged));
+  UPB_ASSERT(!UPB_PRIVATE(_upb_TaggedMessagePtr_IsEmpty)(tagged));
 #endif
 }
 
 UPB_INLINE struct upb_Map* _upb_Message_GetOrCreateMutableMap(
-    upb_Message* msg, const upb_MiniTableField* field, size_t key_size,
+    struct upb_Message* msg, const upb_MiniTableField* field, size_t key_size,
     size_t val_size, upb_Arena* arena) {
   UPB_PRIVATE(_upb_MiniTableField_CheckIsMap)(field);
   _upb_Message_AssertMapIsUntagged(msg, field);
diff --git a/upb/message/internal/extension.c b/upb/message/internal/extension.c
index 81cfa0f..bc180f4 100644
--- a/upb/message/internal/extension.c
+++ b/upb/message/internal/extension.c
@@ -12,14 +12,13 @@
 #include "upb/mem/arena.h"
 #include "upb/message/internal/extension.h"
 #include "upb/message/internal/message.h"
-#include "upb/message/types.h"
 #include "upb/mini_table/extension.h"
 
 // Must be last.
 #include "upb/port/def.inc"
 
 const struct upb_Extension* _upb_Message_Getext(
-    const upb_Message* msg, const upb_MiniTableExtension* e) {
+    const struct upb_Message* msg, const upb_MiniTableExtension* e) {
   size_t n;
   const struct upb_Extension* ext = UPB_PRIVATE(_upb_Message_Getexts)(msg, &n);
 
@@ -36,7 +35,7 @@
 }
 
 const struct upb_Extension* UPB_PRIVATE(_upb_Message_Getexts)(
-    const upb_Message* msg, size_t* count) {
+    const struct upb_Message* msg, size_t* count) {
   const upb_Message_Internal* in = upb_Message_Getinternal(msg);
   if (in->internal) {
     *count = (in->internal->size - in->internal->ext_begin) /
@@ -49,7 +48,8 @@
 }
 
 struct upb_Extension* _upb_Message_GetOrCreateExtension(
-    upb_Message* msg, const upb_MiniTableExtension* e, upb_Arena* arena) {
+    struct upb_Message* msg, const upb_MiniTableExtension* e,
+    upb_Arena* arena) {
   struct upb_Extension* ext =
       (struct upb_Extension*)_upb_Message_Getext(msg, e);
   if (ext) return ext;
diff --git a/upb/message/internal/map.h b/upb/message/internal/map.h
index 139243c..da4223d 100644
--- a/upb/message/internal/map.h
+++ b/upb/message/internal/map.h
@@ -5,8 +5,6 @@
 // license that can be found in the LICENSE file or at
 // https://developers.google.com/open-source/licenses/bsd
 
-// EVERYTHING BELOW THIS LINE IS INTERNAL - DO NOT USE /////////////////////////
-
 #ifndef UPB_MESSAGE_INTERNAL_MAP_H_
 #define UPB_MESSAGE_INTERNAL_MAP_H_
 
@@ -17,11 +15,18 @@
 #include "upb/base/string_view.h"
 #include "upb/hash/str_table.h"
 #include "upb/mem/arena.h"
-#include "upb/message/map.h"
 
 // Must be last.
 #include "upb/port/def.inc"
 
+typedef enum {
+  kUpb_MapInsertStatus_Inserted = 0,
+  kUpb_MapInsertStatus_Replaced = 1,
+  kUpb_MapInsertStatus_OutOfMemory = 2,
+} upb_MapInsertStatus;
+
+// EVERYTHING BELOW THIS LINE IS INTERNAL - DO NOT USE /////////////////////////
+
 struct upb_Map {
   // Size of key and val, based on the map type.
   // Strings are represented as '0' because they must be handled specially.
diff --git a/upb/message/internal/map_entry.h b/upb/message/internal/map_entry.h
index 0c5c25e..9c1ec6b 100644
--- a/upb/message/internal/map_entry.h
+++ b/upb/message/internal/map_entry.h
@@ -12,7 +12,7 @@
 
 #include "upb/base/string_view.h"
 #include "upb/hash/common.h"
-#include "upb/message/internal/types.h"
+#include "upb/message/internal/message.h"
 
 // Map entries aren't actually stored for map fields, they are only used during
 // parsing. For parsing, it helps a lot if all map entry messages have the same
diff --git a/upb/message/internal/map_sorter.h b/upb/message/internal/map_sorter.h
index 2a09b3c..65b58a5 100644
--- a/upb/message/internal/map_sorter.h
+++ b/upb/message/internal/map_sorter.h
@@ -12,6 +12,8 @@
 
 #include <stdlib.h>
 
+#include "upb/base/descriptor_constants.h"
+#include "upb/base/string_view.h"
 #include "upb/mem/alloc.h"
 #include "upb/message/internal/extension.h"
 #include "upb/message/internal/map.h"
@@ -50,7 +52,8 @@
   if (s->entries) upb_gfree(s->entries);
 }
 
-UPB_INLINE bool _upb_sortedmap_next(_upb_mapsorter* s, const upb_Map* map,
+UPB_INLINE bool _upb_sortedmap_next(_upb_mapsorter* s,
+                                    const struct upb_Map* map,
                                     _upb_sortedmap* sorted, upb_MapEntry* ent) {
   if (sorted->pos == sorted->end) return false;
   const upb_tabent* tabent = (const upb_tabent*)s->entries[sorted->pos++];
@@ -75,7 +78,7 @@
 }
 
 bool _upb_mapsorter_pushmap(_upb_mapsorter* s, upb_FieldType key_type,
-                            const upb_Map* map, _upb_sortedmap* sorted);
+                            const struct upb_Map* map, _upb_sortedmap* sorted);
 
 bool _upb_mapsorter_pushexts(_upb_mapsorter* s,
                              const struct upb_Extension* exts, size_t count,
diff --git a/upb/message/internal/message.c b/upb/message/internal/message.c
index 08b70d2..1287dc3 100644
--- a/upb/message/internal/message.c
+++ b/upb/message/internal/message.c
@@ -12,7 +12,6 @@
 
 #include "upb/base/internal/log2.h"
 #include "upb/mem/arena.h"
-#include "upb/message/internal/types.h"
 
 // Must be last.
 #include "upb/port/def.inc"
diff --git a/upb/message/internal/message.h b/upb/message/internal/message.h
index 54af496..a7b5203 100644
--- a/upb/message/internal/message.h
+++ b/upb/message/internal/message.h
@@ -12,15 +12,14 @@
 ** The definitions in this file are internal to upb.
 **/
 
-#ifndef UPB_MESSAGE_INTERNAL_H_
-#define UPB_MESSAGE_INTERNAL_H_
+#ifndef UPB_MESSAGE_INTERNAL_MESSAGE_H_
+#define UPB_MESSAGE_INTERNAL_MESSAGE_H_
 
 #include <stdlib.h>
 #include <string.h>
 
 #include "upb/mem/arena.h"
 #include "upb/message/internal/extension.h"
-#include "upb/message/internal/types.h"
 #include "upb/mini_table/message.h"
 
 // Must be last.
@@ -39,7 +38,7 @@
  * these before the user's data.  The user's upb_Message* points after the
  * upb_Message_Internal. */
 
-struct upb_Message_InternalData {
+typedef struct {
   /* Total size of this structure, including the data that follows.
    * Must be aligned to 8, which is alignof(upb_Extension) */
   uint32_t size;
@@ -61,6 +60,20 @@
   uint32_t ext_begin;
   /* Data follows, as if there were an array:
    *   char data[size - sizeof(upb_Message_InternalData)]; */
+} upb_Message_InternalData;
+
+typedef struct {
+  union {
+    upb_Message_InternalData* internal;
+
+    // Force 8-byte alignment, since the data members may contain members that
+    // require 8-byte alignment.
+    double d;
+  };
+} upb_Message_Internal;
+
+struct upb_Message {
+  int unused;  // Placeholder cuz Windows won't compile an empty struct.
 };
 
 UPB_INLINE size_t upb_msg_sizeof(const upb_MiniTable* m) {
@@ -103,4 +116,4 @@
 
 #include "upb/port/undef.inc"
 
-#endif /* UPB_MESSAGE_INTERNAL_H_ */
+#endif /* UPB_MESSAGE_INTERNAL_MESSAGE_H_ */
diff --git a/upb/message/internal/tagged_ptr.h b/upb/message/internal/tagged_ptr.h
new file mode 100644
index 0000000..b1c9a77
--- /dev/null
+++ b/upb/message/internal/tagged_ptr.h
@@ -0,0 +1,59 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2023 Google LLC.  All rights reserved.
+//
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file or at
+// https://developers.google.com/open-source/licenses/bsd
+
+#ifndef UPB_MINI_TABLE_INTERNAL_TAGGED_PTR_H_
+#define UPB_MINI_TABLE_INTERNAL_TAGGED_PTR_H_
+
+#include <stdint.h>
+
+#include "upb/message/internal/message.h"
+
+// Must be last.
+#include "upb/port/def.inc"
+
+typedef uintptr_t upb_TaggedMessagePtr;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// Internal-only because empty messages cannot be created by the user.
+UPB_INLINE upb_TaggedMessagePtr
+UPB_PRIVATE(_upb_TaggedMessagePtr_Pack)(struct upb_Message* ptr, bool empty) {
+  UPB_ASSERT(((uintptr_t)ptr & 1) == 0);
+  return (uintptr_t)ptr | (empty ? 1 : 0);
+}
+
+UPB_INLINE bool UPB_PRIVATE(_upb_TaggedMessagePtr_IsEmpty)(
+    upb_TaggedMessagePtr ptr) {
+  return ptr & 1;
+}
+
+UPB_INLINE struct upb_Message* UPB_PRIVATE(_upb_TaggedMessagePtr_GetMessage)(
+    upb_TaggedMessagePtr ptr) {
+  return (struct upb_Message*)(ptr & ~(uintptr_t)1);
+}
+
+UPB_INLINE struct upb_Message* UPB_PRIVATE(
+    _upb_TaggedMessagePtr_GetNonEmptyMessage)(upb_TaggedMessagePtr ptr) {
+  UPB_ASSERT(!UPB_PRIVATE(_upb_TaggedMessagePtr_IsEmpty)(ptr));
+  return UPB_PRIVATE(_upb_TaggedMessagePtr_GetMessage)(ptr);
+}
+
+UPB_INLINE struct upb_Message* UPB_PRIVATE(
+    _upb_TaggedMessagePtr_GetEmptyMessage)(upb_TaggedMessagePtr ptr) {
+  UPB_ASSERT(UPB_PRIVATE(_upb_TaggedMessagePtr_IsEmpty)(ptr));
+  return UPB_PRIVATE(_upb_TaggedMessagePtr_GetMessage)(ptr);
+}
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port/undef.inc"
+
+#endif /* UPB_MINI_TABLE_INTERNAL_TAGGED_PTR_H_ */
diff --git a/upb/message/internal/types.h b/upb/message/internal/types.h
deleted file mode 100644
index 2bd3b0b..0000000
--- a/upb/message/internal/types.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2023 Google LLC.  All rights reserved.
-//
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file or at
-// https://developers.google.com/open-source/licenses/bsd
-
-#ifndef UPB_MINI_TABLE_INTERNAL_TYPES_H_
-#define UPB_MINI_TABLE_INTERNAL_TYPES_H_
-
-typedef struct upb_Message_InternalData upb_Message_InternalData;
-
-typedef struct {
-  union {
-    upb_Message_InternalData* internal;
-
-    // Force 8-byte alignment, since the data members may contain members that
-    // require 8-byte alignment.
-    double d;
-  };
-} upb_Message_Internal;
-
-#endif  // UPB_MINI_TABLE_INTERNAL_TYPES_H_
diff --git a/upb/message/map.h b/upb/message/map.h
index 4160c35..e471a6b 100644
--- a/upb/message/map.h
+++ b/upb/message/map.h
@@ -12,7 +12,8 @@
 
 #include "upb/base/descriptor_constants.h"
 #include "upb/mem/arena.h"
-#include "upb/message/value.h"  // IWYU pragma: export
+#include "upb/message/internal/map.h"
+#include "upb/message/value.h"
 
 // Must be last.
 #include "upb/port/def.inc"
@@ -39,12 +40,6 @@
 // Removes all entries in the map.
 UPB_API void upb_Map_Clear(upb_Map* map);
 
-typedef enum {
-  kUpb_MapInsertStatus_Inserted = 0,
-  kUpb_MapInsertStatus_Replaced = 1,
-  kUpb_MapInsertStatus_OutOfMemory = 2,
-} upb_MapInsertStatus;
-
 // Sets the given key to the given value, returning whether the key was inserted
 // or replaced. If the key was inserted, then any existing iterators will be
 // invalidated.
diff --git a/upb/message/message.c b/upb/message/message.c
index 4f0fee1..fe52731 100644
--- a/upb/message/message.c
+++ b/upb/message/message.c
@@ -13,7 +13,6 @@
 
 #include "upb/mem/arena.h"
 #include "upb/message/internal/message.h"
-#include "upb/message/internal/types.h"
 #include "upb/mini_table/message.h"
 
 // Must be last.
diff --git a/upb/message/message.h b/upb/message/message.h
index bf04f6f..95ac504 100644
--- a/upb/message/message.h
+++ b/upb/message/message.h
@@ -15,13 +15,13 @@
 #include <stddef.h>
 
 #include "upb/mem/arena.h"
-#include "upb/message/types.h"  // IWYU pragma: export
 #include "upb/mini_table/message.h"
 
 // Must be last.
 #include "upb/port/def.inc"
 
 typedef struct upb_Extension upb_Extension;
+typedef struct upb_Message upb_Message;
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/upb/message/promote.c b/upb/message/promote.c
index 593b09f..2cd0888 100644
--- a/upb/message/promote.c
+++ b/upb/message/promote.c
@@ -18,6 +18,7 @@
 #include "upb/message/internal/array.h"
 #include "upb/message/internal/extension.h"
 #include "upb/message/internal/message.h"
+#include "upb/message/internal/tagged_ptr.h"
 #include "upb/message/map.h"
 #include "upb/message/message.h"
 #include "upb/message/tagged_ptr.h"
@@ -154,7 +155,8 @@
                                                const upb_MiniTable* mini_table,
                                                int decode_options,
                                                upb_Arena* arena) {
-  upb_Message* empty = _upb_TaggedMessagePtr_GetEmptyMessage(*tagged);
+  upb_Message* empty =
+      UPB_PRIVATE(_upb_TaggedMessagePtr_GetEmptyMessage)(*tagged);
   size_t unknown_size;
   const char* unknown_data = upb_Message_GetUnknown(empty, &unknown_size);
   upb_Message* promoted = upb_Message_New(mini_table, arena);
@@ -162,7 +164,7 @@
   upb_DecodeStatus status = upb_Decode(unknown_data, unknown_size, promoted,
                                        mini_table, NULL, decode_options, arena);
   if (status == kUpb_DecodeStatus_Ok) {
-    *tagged = _upb_TaggedMessagePtr_Pack(promoted, false);
+    *tagged = UPB_PRIVATE(_upb_TaggedMessagePtr_Pack)(promoted, false);
   }
   return status;
 }
diff --git a/upb/message/tagged_ptr.h b/upb/message/tagged_ptr.h
index 9004c77..f2e1bfd 100644
--- a/upb/message/tagged_ptr.h
+++ b/upb/message/tagged_ptr.h
@@ -10,15 +10,16 @@
 
 #include <stdint.h>
 
-#include "upb/message/types.h"  // IWYU pragma: export
+#include "upb/message/internal/tagged_ptr.h"
+#include "upb/message/message.h"
 
 // Must be last.
 #include "upb/port/def.inc"
 
 // When a upb_Message* is stored in a message, array, or map, it is stored in a
-// tagged form.  If the tag bit is set, the referenced upb_Message is of type
+// tagged form. If the tag bit is set, the referenced upb_Message is of type
 // _kUpb_MiniTable_Empty (a sentinel message type with no fields) instead of
-// that field's true message type.  This forms the basis of what we call
+// that field's true message type. This forms the basis of what we call
 // "dynamic tree shaking."
 //
 // See the documentation for kUpb_DecodeOption_ExperimentalAllowUnlinked for
@@ -30,35 +31,16 @@
 extern "C" {
 #endif
 
-// Internal-only because empty messages cannot be created by the user.
-UPB_INLINE upb_TaggedMessagePtr _upb_TaggedMessagePtr_Pack(upb_Message* ptr,
-                                                           bool empty) {
-  UPB_ASSERT(((uintptr_t)ptr & 1) == 0);
-  return (uintptr_t)ptr | (empty ? 1 : 0);
-}
-
 // Users who enable unlinked sub-messages must use this to test whether a
-// message is empty before accessing it.  If a message is empty, it must be
+// message is empty before accessing it. If a message is empty, it must be
 // first promoted using the interfaces in message/promote.h.
 UPB_INLINE bool upb_TaggedMessagePtr_IsEmpty(upb_TaggedMessagePtr ptr) {
-  return ptr & 1;
-}
-
-UPB_INLINE upb_Message* _upb_TaggedMessagePtr_GetMessage(
-    upb_TaggedMessagePtr ptr) {
-  return (upb_Message*)(ptr & ~(uintptr_t)1);
+  return UPB_PRIVATE(_upb_TaggedMessagePtr_IsEmpty)(ptr);
 }
 
 UPB_INLINE upb_Message* upb_TaggedMessagePtr_GetNonEmptyMessage(
     upb_TaggedMessagePtr ptr) {
-  UPB_ASSERT(!upb_TaggedMessagePtr_IsEmpty(ptr));
-  return _upb_TaggedMessagePtr_GetMessage(ptr);
-}
-
-UPB_INLINE upb_Message* _upb_TaggedMessagePtr_GetEmptyMessage(
-    upb_TaggedMessagePtr ptr) {
-  UPB_ASSERT(upb_TaggedMessagePtr_IsEmpty(ptr));
-  return _upb_TaggedMessagePtr_GetMessage(ptr);
+  return UPB_PRIVATE(_upb_TaggedMessagePtr_GetNonEmptyMessage)(ptr);
 }
 
 #ifdef __cplusplus
diff --git a/upb/message/types.h b/upb/message/types.h
deleted file mode 100644
index d20cf27..0000000
--- a/upb/message/types.h
+++ /dev/null
@@ -1,17 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2023 Google LLC.  All rights reserved.
-//
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file or at
-// https://developers.google.com/open-source/licenses/bsd
-
-#ifndef UPB_MESSAGE_TYPES_H_
-#define UPB_MESSAGE_TYPES_H_
-
-// This typedef is in a leaf header to resolve a circular dependency between
-// messages and mini tables.
-typedef struct upb_Message {
-  int unused;  // Placeholder cuz Windows won't compile an empty struct.
-} upb_Message;
-
-#endif /* UPB_MESSAGE_TYPES_H_ */
diff --git a/upb/message/value.h b/upb/message/value.h
index 547edc1..775622c 100644
--- a/upb/message/value.h
+++ b/upb/message/value.h
@@ -14,7 +14,10 @@
 #include <stdint.h>
 
 #include "upb/base/string_view.h"
-#include "upb/message/tagged_ptr.h"
+#include "upb/message/internal/array.h"
+#include "upb/message/internal/map.h"
+#include "upb/message/internal/message.h"
+#include "upb/message/internal/tagged_ptr.h"
 
 typedef union {
   bool bool_val;
diff --git a/upb/mini_descriptor/BUILD b/upb/mini_descriptor/BUILD
index b1932ea..b1793c6 100644
--- a/upb/mini_descriptor/BUILD
+++ b/upb/mini_descriptor/BUILD
@@ -66,6 +66,7 @@
         "//upb:mini_table",
         "//upb:port",
         "//upb:wire",
+        "//upb/message:internal",
         "@com_google_absl//absl/container:flat_hash_set",
         "@com_google_googletest//:gtest",
         "@com_google_googletest//:gtest_main",
diff --git a/upb/reflection/BUILD b/upb/reflection/BUILD
index e42ebda..9bb1b64 100644
--- a/upb/reflection/BUILD
+++ b/upb/reflection/BUILD
@@ -64,10 +64,10 @@
         "//upb:base",
         "//upb:mem",
         "//upb:message",
-        "//upb:message_value",
         "//upb:mini_descriptor",
         "//upb:mini_table",
         "//upb:port",
+        "//upb/message:internal",
     ],
 )
 
@@ -138,12 +138,12 @@
         "//upb:message",
         "//upb:message_accessors",
         "//upb:message_copy",
-        "//upb:message_value",
         "//upb:mini_descriptor",
         "//upb:mini_table",
         "//upb:port",
         "//upb:wire",
         "//upb/base:internal",
+        "//upb/message:internal",
         "//upb/mini_descriptor:internal",
     ],
 )
diff --git a/upb/reflection/field_def.c b/upb/reflection/field_def.c
index 3b60896..8f849a5 100644
--- a/upb/reflection/field_def.c
+++ b/upb/reflection/field_def.c
@@ -19,7 +19,6 @@
 #include "upb/base/upcast.h"
 #include "upb/mem/arena.h"
 #include "upb/message/accessors.h"
-#include "upb/message/value.h"
 #include "upb/mini_descriptor/decode.h"
 #include "upb/mini_descriptor/internal/encode.h"
 #include "upb/mini_descriptor/internal/modifiers.h"
diff --git a/upb/reflection/message.h b/upb/reflection/message.h
index 54af6f1..d31f6b9 100644
--- a/upb/reflection/message.h
+++ b/upb/reflection/message.h
@@ -13,7 +13,6 @@
 #include "upb/mem/arena.h"
 #include "upb/message/map.h"
 #include "upb/message/message.h"
-#include "upb/message/value.h"  // IWYU pragma: export
 #include "upb/reflection/common.h"
 
 // Must be last.
diff --git a/upb/text/BUILD b/upb/text/BUILD
index 6a1a97c..a9ba0db 100644
--- a/upb/text/BUILD
+++ b/upb/text/BUILD
@@ -25,6 +25,7 @@
         "//upb:reflection",
         "//upb:wire",
         "//upb:wire_reader",
+        "//upb/message:internal",
     ],
 )
 
diff --git a/upb/wire/BUILD b/upb/wire/BUILD
index fdfb223..93be09b 100644
--- a/upb/wire/BUILD
+++ b/upb/wire/BUILD
@@ -32,11 +32,10 @@
         "//upb:mem",
         "//upb:message",
         "//upb:message_accessors",
-        "//upb:message_tagged_ptr",
-        "//upb:message_types",
         "//upb:mini_table",
         "//upb:port",
         "//upb/mem:internal",
+        "//upb/message:internal",
         "//upb/mini_table:internal",
     ],
 )
diff --git a/upb/wire/decode.c b/upb/wire/decode.c
index a0fd7c1..a80f65c 100644
--- a/upb/wire/decode.c
+++ b/upb/wire/decode.c
@@ -24,6 +24,7 @@
 #include "upb/message/internal/map.h"
 #include "upb/message/internal/map_entry.h"
 #include "upb/message/internal/message.h"
+#include "upb/message/internal/tagged_ptr.h"
 #include "upb/message/map.h"
 #include "upb/message/message.h"
 #include "upb/message/tagged_ptr.h"
@@ -32,6 +33,7 @@
 #include "upb/mini_table/extension_registry.h"
 #include "upb/mini_table/field.h"
 #include "upb/mini_table/internal/field.h"
+#include "upb/mini_table/internal/message.h"
 #include "upb/mini_table/internal/size_log2.h"
 #include "upb/mini_table/message.h"
 #include "upb/mini_table/sub.h"
@@ -258,7 +260,8 @@
     _upb_Decoder_ErrorJmp(d, kUpb_DecodeStatus_UnlinkedSubMessage);
   }
 
-  upb_TaggedMessagePtr tagged = _upb_TaggedMessagePtr_Pack(msg, is_empty);
+  upb_TaggedMessagePtr tagged =
+      UPB_PRIVATE(_upb_TaggedMessagePtr_Pack)(msg, is_empty);
   memcpy(target, &tagged, sizeof(tagged));
   return msg;
 }
@@ -271,13 +274,14 @@
   UPB_ASSERT(subl);
   if (!upb_TaggedMessagePtr_IsEmpty(tagged) ||
       UPB_PRIVATE(_upb_MiniTable_IsEmpty)(subl)) {
-    return _upb_TaggedMessagePtr_GetMessage(tagged);
+    return UPB_PRIVATE(_upb_TaggedMessagePtr_GetMessage)(tagged);
   }
 
   // We found an empty message from a previous parse that was performed before
   // this field was linked.  But it is linked now, so we want to allocate a new
   // message of the correct type and promote data into it before continuing.
-  upb_Message* existing = _upb_TaggedMessagePtr_GetEmptyMessage(tagged);
+  upb_Message* existing =
+      UPB_PRIVATE(_upb_TaggedMessagePtr_GetEmptyMessage)(tagged);
   upb_Message* promoted = _upb_Decoder_NewSubMessage(d, subs, field, target);
   size_t size;
   const char* unknown = upb_Message_GetUnknown(existing, &size);
diff --git a/upb/wire/encode.c b/upb/wire/encode.c
index 1d04ce6..5797e97 100644
--- a/upb/wire/encode.c
+++ b/upb/wire/encode.c
@@ -26,12 +26,14 @@
 #include "upb/message/internal/map.h"
 #include "upb/message/internal/map_entry.h"
 #include "upb/message/internal/map_sorter.h"
+#include "upb/message/internal/tagged_ptr.h"
 #include "upb/message/map.h"
 #include "upb/message/message.h"
 #include "upb/message/tagged_ptr.h"
 #include "upb/mini_table/extension.h"
 #include "upb/mini_table/field.h"
 #include "upb/mini_table/internal/field.h"
+#include "upb/mini_table/internal/message.h"
 #include "upb/mini_table/message.h"
 #include "upb/mini_table/sub.h"
 #include "upb/wire/internal/constants.h"
@@ -217,7 +219,8 @@
   if (upb_TaggedMessagePtr_IsEmpty(tagged)) {
     m = UPB_PRIVATE(_upb_MiniTable_Empty)();
   }
-  encode_message(e, _upb_TaggedMessagePtr_GetMessage(tagged), m, size);
+  encode_message(e, UPB_PRIVATE(_upb_TaggedMessagePtr_GetMessage)(tagged), m,
+                 size);
 }
 
 static void encode_scalar(upb_encstate* e, const void* _field_mem,
diff --git a/upb/wire/encode.h b/upb/wire/encode.h
index 4c5969d..fed261d 100644
--- a/upb/wire/encode.h
+++ b/upb/wire/encode.h
@@ -14,7 +14,7 @@
 #include <stdint.h>
 
 #include "upb/mem/arena.h"
-#include "upb/message/types.h"
+#include "upb/message/message.h"
 #include "upb/mini_table/message.h"
 
 // Must be last.
diff --git a/upb/wire/internal/decode_fast.c b/upb/wire/internal/decode_fast.c
index 27d648f..9837003 100644
--- a/upb/wire/internal/decode_fast.c
+++ b/upb/wire/internal/decode_fast.c
@@ -19,7 +19,6 @@
 
 #include "upb/message/array.h"
 #include "upb/message/internal/array.h"
-#include "upb/message/internal/types.h"
 #include "upb/mini_table/sub.h"
 #include "upb/wire/internal/decoder.h"