Make PbFieldType members public (#1027)

To be able to have JSON decoders as libraries that are conditionally imported
based on the compilation target, this makes `PbFieldType` members public.
diff --git a/protobuf/CHANGELOG.md b/protobuf/CHANGELOG.md
index 9d10a96..a987ef8 100644
--- a/protobuf/CHANGELOG.md
+++ b/protobuf/CHANGELOG.md
@@ -5,7 +5,11 @@
   using different encoding/decoding libraries based on the target platform.
   ([#1026])
 
+* Some of the private `PbFieldType` members are made public, to allow using
+  them in internal libraries. This type is for internal use only. ([#1027])
+
 [#1026]: https://github.com/google/protobuf.dart/pull/1026
+[#1027]: https://github.com/google/protobuf.dart/pull/1027
 
 ## 4.1.1
 
diff --git a/protobuf/lib/protobuf.dart b/protobuf/lib/protobuf.dart
index 2c6ef83..d1e569b 100644
--- a/protobuf/lib/protobuf.dart
+++ b/protobuf/lib/protobuf.dart
@@ -16,4 +16,6 @@
         FieldSet,
         FieldSetInternalExtension,
         GeneratedMessageInternalExtension,
-        MapFieldInfoInternalExtension;
+        MapFieldInfoInternalExtension,
+        mapKeyFieldNumber,
+        mapValueFieldNumber;
diff --git a/protobuf/lib/src/protobuf/builder_info.dart b/protobuf/lib/src/protobuf/builder_info.dart
index 24af811..d21b3df 100644
--- a/protobuf/lib/src/protobuf/builder_info.dart
+++ b/protobuf/lib/src/protobuf/builder_info.dart
@@ -274,7 +274,10 @@
 
   // Repeated, not a message, group, or enum.
   void p<T>(int tagNumber, String name, int fieldType, {String? protoName}) {
-    assert(!_isGroupOrMessage(fieldType) && !_isEnum(fieldType));
+    assert(
+      !PbFieldType.isGroupOrMessage(fieldType) &&
+          !PbFieldType.isEnum(fieldType),
+    );
     addRepeated<T>(
       tagNumber,
       name,
@@ -298,7 +301,9 @@
     ProtobufEnum? defaultEnumValue,
     String? protoName,
   }) {
-    assert(_isGroupOrMessage(fieldType) || _isEnum(fieldType));
+    assert(
+      PbFieldType.isGroupOrMessage(fieldType) || PbFieldType.isEnum(fieldType),
+    );
     addRepeated<T>(
       tagNumber,
       name,
diff --git a/protobuf/lib/src/protobuf/coded_buffer.dart b/protobuf/lib/src/protobuf/coded_buffer.dart
index 9210265..0150e1b 100644
--- a/protobuf/lib/src/protobuf/coded_buffer.dart
+++ b/protobuf/lib/src/protobuf/coded_buffer.dart
@@ -54,24 +54,24 @@
 
     // Ignore required/optional packed/unpacked.
     var fieldType = fi.type;
-    fieldType &= ~(PbFieldType._PACKED_BIT | PbFieldType._REQUIRED_BIT);
+    fieldType &= ~(PbFieldType.PACKED_BIT | PbFieldType.REQUIRED_BIT);
     switch (fieldType) {
-      case PbFieldType._OPTIONAL_BOOL:
+      case PbFieldType.OPTIONAL_BOOL:
         fs._setFieldUnchecked(meta, fi, input.readBool());
         break;
-      case PbFieldType._OPTIONAL_BYTES:
+      case PbFieldType.OPTIONAL_BYTES:
         fs._setFieldUnchecked(meta, fi, input.readBytes());
         break;
-      case PbFieldType._OPTIONAL_STRING:
+      case PbFieldType.OPTIONAL_STRING:
         fs._setFieldUnchecked(meta, fi, input.readString());
         break;
-      case PbFieldType._OPTIONAL_FLOAT:
+      case PbFieldType.OPTIONAL_FLOAT:
         fs._setFieldUnchecked(meta, fi, input.readFloat());
         break;
-      case PbFieldType._OPTIONAL_DOUBLE:
+      case PbFieldType.OPTIONAL_DOUBLE:
         fs._setFieldUnchecked(meta, fi, input.readDouble());
         break;
-      case PbFieldType._OPTIONAL_ENUM:
+      case PbFieldType.OPTIONAL_ENUM:
         final rawValue = input.readEnum();
         final value = meta._decodeEnum(tagNumber, registry, rawValue);
         if (value == null) {
@@ -81,7 +81,7 @@
           fs._setFieldUnchecked(meta, fi, value);
         }
         break;
-      case PbFieldType._OPTIONAL_GROUP:
+      case PbFieldType.OPTIONAL_GROUP:
         final subMessage = meta._makeEmptyMessage(tagNumber, registry);
         final oldValue = fs._getFieldOrNull(fi);
         if (oldValue != null) {
@@ -90,37 +90,37 @@
         input.readGroup(tagNumber, subMessage, registry);
         fs._setFieldUnchecked(meta, fi, subMessage);
         break;
-      case PbFieldType._OPTIONAL_INT32:
+      case PbFieldType.OPTIONAL_INT32:
         fs._setFieldUnchecked(meta, fi, input.readInt32());
         break;
-      case PbFieldType._OPTIONAL_INT64:
+      case PbFieldType.OPTIONAL_INT64:
         fs._setFieldUnchecked(meta, fi, input.readInt64());
         break;
-      case PbFieldType._OPTIONAL_SINT32:
+      case PbFieldType.OPTIONAL_SINT32:
         fs._setFieldUnchecked(meta, fi, input.readSint32());
         break;
-      case PbFieldType._OPTIONAL_SINT64:
+      case PbFieldType.OPTIONAL_SINT64:
         fs._setFieldUnchecked(meta, fi, input.readSint64());
         break;
-      case PbFieldType._OPTIONAL_UINT32:
+      case PbFieldType.OPTIONAL_UINT32:
         fs._setFieldUnchecked(meta, fi, input.readUint32());
         break;
-      case PbFieldType._OPTIONAL_UINT64:
+      case PbFieldType.OPTIONAL_UINT64:
         fs._setFieldUnchecked(meta, fi, input.readUint64());
         break;
-      case PbFieldType._OPTIONAL_FIXED32:
+      case PbFieldType.OPTIONAL_FIXED32:
         fs._setFieldUnchecked(meta, fi, input.readFixed32());
         break;
-      case PbFieldType._OPTIONAL_FIXED64:
+      case PbFieldType.OPTIONAL_FIXED64:
         fs._setFieldUnchecked(meta, fi, input.readFixed64());
         break;
-      case PbFieldType._OPTIONAL_SFIXED32:
+      case PbFieldType.OPTIONAL_SFIXED32:
         fs._setFieldUnchecked(meta, fi, input.readSfixed32());
         break;
-      case PbFieldType._OPTIONAL_SFIXED64:
+      case PbFieldType.OPTIONAL_SFIXED64:
         fs._setFieldUnchecked(meta, fi, input.readSfixed64());
         break;
-      case PbFieldType._OPTIONAL_MESSAGE:
+      case PbFieldType.OPTIONAL_MESSAGE:
         final GeneratedMessage? oldValue = fs._getFieldOrNull(fi);
         if (oldValue != null) {
           input.readMessage(oldValue, registry);
@@ -130,7 +130,7 @@
           fs._setFieldUnchecked(meta, fi, subMessage);
         }
         break;
-      case PbFieldType._REPEATED_BOOL:
+      case PbFieldType.REPEATED_BOOL:
         final list = fs._ensureRepeatedField(meta, fi);
         if (wireType == WIRETYPE_LENGTH_DELIMITED) {
           final limit = input.readInt32();
@@ -150,17 +150,17 @@
           list._addUnchecked(input.readBool());
         }
         break;
-      case PbFieldType._REPEATED_BYTES:
+      case PbFieldType.REPEATED_BYTES:
         final list = fs._ensureRepeatedField(meta, fi);
         list._checkModifiable('add');
         list._addUnchecked(input.readBytes());
         break;
-      case PbFieldType._REPEATED_STRING:
+      case PbFieldType.REPEATED_STRING:
         final list = fs._ensureRepeatedField(meta, fi);
         list._checkModifiable('add');
         list._addUnchecked(input.readString());
         break;
-      case PbFieldType._REPEATED_FLOAT:
+      case PbFieldType.REPEATED_FLOAT:
         final list = fs._ensureRepeatedField(meta, fi);
         if (wireType == WIRETYPE_LENGTH_DELIMITED) {
           final limit = input.readInt32();
@@ -177,7 +177,7 @@
           list._addUnchecked(input.readFloat());
         }
         break;
-      case PbFieldType._REPEATED_DOUBLE:
+      case PbFieldType.REPEATED_DOUBLE:
         final list = fs._ensureRepeatedField(meta, fi);
         if (wireType == WIRETYPE_LENGTH_DELIMITED) {
           final limit = input.readInt32();
@@ -194,7 +194,7 @@
           list._addUnchecked(input.readDouble());
         }
         break;
-      case PbFieldType._REPEATED_ENUM:
+      case PbFieldType.REPEATED_ENUM:
         final list = fs._ensureRepeatedField(meta, fi);
         _readPackableToListEnum(
           list,
@@ -206,13 +206,13 @@
           registry,
         );
         break;
-      case PbFieldType._REPEATED_GROUP:
+      case PbFieldType.REPEATED_GROUP:
         final subMessage = meta._makeEmptyMessage(tagNumber, registry);
         input.readGroup(tagNumber, subMessage, registry);
         final list = fs._ensureRepeatedField(meta, fi);
         list.add(subMessage);
         break;
-      case PbFieldType._REPEATED_INT32:
+      case PbFieldType.REPEATED_INT32:
         final list = fs._ensureRepeatedField(meta, fi);
         if (wireType == WIRETYPE_LENGTH_DELIMITED) {
           final limit = input.readInt32();
@@ -229,7 +229,7 @@
           list._addUnchecked(input.readInt32());
         }
         break;
-      case PbFieldType._REPEATED_INT64:
+      case PbFieldType.REPEATED_INT64:
         final list = fs._ensureRepeatedField(meta, fi);
         if (wireType == WIRETYPE_LENGTH_DELIMITED) {
           final limit = input.readInt32();
@@ -246,7 +246,7 @@
           list._addUnchecked(input.readInt64());
         }
         break;
-      case PbFieldType._REPEATED_SINT32:
+      case PbFieldType.REPEATED_SINT32:
         final list = fs._ensureRepeatedField(meta, fi);
         if (wireType == WIRETYPE_LENGTH_DELIMITED) {
           final limit = input.readInt32();
@@ -263,7 +263,7 @@
           list._addUnchecked(input.readSint32());
         }
         break;
-      case PbFieldType._REPEATED_SINT64:
+      case PbFieldType.REPEATED_SINT64:
         final list = fs._ensureRepeatedField(meta, fi);
         if (wireType == WIRETYPE_LENGTH_DELIMITED) {
           final limit = input.readInt32();
@@ -280,7 +280,7 @@
           list._addUnchecked(input.readSint64());
         }
         break;
-      case PbFieldType._REPEATED_UINT32:
+      case PbFieldType.REPEATED_UINT32:
         final list = fs._ensureRepeatedField(meta, fi);
         if (wireType == WIRETYPE_LENGTH_DELIMITED) {
           final limit = input.readInt32();
@@ -297,7 +297,7 @@
           list._addUnchecked(input.readUint32());
         }
         break;
-      case PbFieldType._REPEATED_UINT64:
+      case PbFieldType.REPEATED_UINT64:
         final list = fs._ensureRepeatedField(meta, fi);
         if (wireType == WIRETYPE_LENGTH_DELIMITED) {
           final limit = input.readInt32();
@@ -314,7 +314,7 @@
           list._addUnchecked(input.readUint64());
         }
         break;
-      case PbFieldType._REPEATED_FIXED32:
+      case PbFieldType.REPEATED_FIXED32:
         final list = fs._ensureRepeatedField(meta, fi);
         if (wireType == WIRETYPE_LENGTH_DELIMITED) {
           final limit = input.readInt32();
@@ -331,7 +331,7 @@
           list._addUnchecked(input.readFixed32());
         }
         break;
-      case PbFieldType._REPEATED_FIXED64:
+      case PbFieldType.REPEATED_FIXED64:
         final list = fs._ensureRepeatedField(meta, fi);
         if (wireType == WIRETYPE_LENGTH_DELIMITED) {
           final limit = input.readInt32();
@@ -348,7 +348,7 @@
           list._addUnchecked(input.readFixed64());
         }
         break;
-      case PbFieldType._REPEATED_SFIXED32:
+      case PbFieldType.REPEATED_SFIXED32:
         final list = fs._ensureRepeatedField(meta, fi);
         if (wireType == WIRETYPE_LENGTH_DELIMITED) {
           final limit = input.readInt32();
@@ -365,7 +365,7 @@
           list._addUnchecked(input.readSfixed32());
         }
         break;
-      case PbFieldType._REPEATED_SFIXED64:
+      case PbFieldType.REPEATED_SFIXED64:
         final list = fs._ensureRepeatedField(meta, fi);
         if (wireType == WIRETYPE_LENGTH_DELIMITED) {
           final limit = input.readInt32();
@@ -382,13 +382,13 @@
           list._addUnchecked(input.readSfixed64());
         }
         break;
-      case PbFieldType._REPEATED_MESSAGE:
+      case PbFieldType.REPEATED_MESSAGE:
         final subMessage = meta._makeEmptyMessage(tagNumber, registry);
         input.readMessage(subMessage, registry);
         final list = fs._ensureRepeatedField(meta, fi);
         list.add(subMessage);
         break;
-      case PbFieldType._MAP:
+      case PbFieldType.MAP:
         final mapFieldInfo = fi as MapFieldInfo;
         final mapEntryMeta = mapFieldInfo.mapEntryBuilderInfo;
         fs
diff --git a/protobuf/lib/src/protobuf/coded_buffer_writer.dart b/protobuf/lib/src/protobuf/coded_buffer_writer.dart
index 312e8fd..8809ce2 100644
--- a/protobuf/lib/src/protobuf/coded_buffer_writer.dart
+++ b/protobuf/lib/src/protobuf/coded_buffer_writer.dart
@@ -65,9 +65,9 @@
   }
 
   void writeField(int fieldNumber, int fieldType, Object? fieldValue) {
-    final valueType = PbFieldType._baseType(fieldType);
+    final valueType = PbFieldType.baseType(fieldType);
 
-    if ((fieldType & PbFieldType._PACKED_BIT) != 0) {
+    if ((fieldType & PbFieldType.PACKED_BIT) != 0) {
       final list = fieldValue as List;
       if (list.isNotEmpty) {
         _writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
@@ -80,7 +80,7 @@
       return;
     }
 
-    if ((fieldType & PbFieldType._MAP_BIT) != 0) {
+    if ((fieldType & PbFieldType.MAP_BIT) != 0) {
       final map = fieldValue as PbMap;
       final keyWireFormat = _wireTypes[_valueTypeIndex(map.keyFieldType)];
       final valueWireFormat = _wireTypes[_valueTypeIndex(map.valueFieldType)];
@@ -107,7 +107,7 @@
 
     final wireFormat = _wireTypes[_valueTypeIndex(valueType)];
 
-    if ((fieldType & PbFieldType._REPEATED_BIT) != 0) {
+    if ((fieldType & PbFieldType.REPEATED_BIT) != 0) {
       final list = fieldValue as List;
       for (var i = 0; i < list.length; i++) {
         _writeValue(fieldNumber, valueType, list[i], wireFormat);
@@ -353,10 +353,10 @@
 
   void _writeValueAs(int valueType, dynamic value) {
     switch (valueType) {
-      case PbFieldType._BOOL_BIT:
+      case PbFieldType.BOOL_BIT:
         _writeVarint32(value ? 1 : 0);
         break;
-      case PbFieldType._BYTES_BIT:
+      case PbFieldType.BYTES_BIT:
         final List<int> bytes = value;
         if (bytes is Uint8List) {
           _writeBytesNoTag(bytes);
@@ -366,7 +366,7 @@
           _writeBytesNoTag(Uint8List.fromList(bytes));
         }
         break;
-      case PbFieldType._STRING_BIT:
+      case PbFieldType.STRING_BIT:
         final String string = value;
         if (string.isEmpty) {
           _writeEmptyBytes();
@@ -374,17 +374,17 @@
           _writeBytesNoTag(const Utf8Encoder().convert(string));
         }
         break;
-      case PbFieldType._DOUBLE_BIT:
+      case PbFieldType.DOUBLE_BIT:
         _writeDouble(value);
         break;
-      case PbFieldType._FLOAT_BIT:
+      case PbFieldType.FLOAT_BIT:
         _writeFloat(value);
         break;
-      case PbFieldType._ENUM_BIT:
+      case PbFieldType.ENUM_BIT:
         final ProtobufEnum enum_ = value;
         _writeVarint32(enum_.value & 0xffffffff);
         break;
-      case PbFieldType._GROUP_BIT:
+      case PbFieldType.GROUP_BIT:
         // `value` is `UnknownFieldSet` or `GeneratedMessage`. Test for
         // `UnknownFieldSet` as it doesn't have subtypes, so the type test will
         // be fast.
@@ -399,37 +399,37 @@
           message.writeToCodedBufferWriter(this);
         }
         break;
-      case PbFieldType._INT32_BIT:
+      case PbFieldType.INT32_BIT:
         _writeVarint64(Int64(value));
         break;
-      case PbFieldType._INT64_BIT:
+      case PbFieldType.INT64_BIT:
         _writeVarint64(value);
         break;
-      case PbFieldType._SINT32_BIT:
+      case PbFieldType.SINT32_BIT:
         _writeVarint32(_encodeZigZag32(value));
         break;
-      case PbFieldType._SINT64_BIT:
+      case PbFieldType.SINT64_BIT:
         _writeVarint64(_encodeZigZag64(value));
         break;
-      case PbFieldType._UINT32_BIT:
+      case PbFieldType.UINT32_BIT:
         _writeVarint32(value);
         break;
-      case PbFieldType._UINT64_BIT:
+      case PbFieldType.UINT64_BIT:
         _writeVarint64(value);
         break;
-      case PbFieldType._FIXED32_BIT:
+      case PbFieldType.FIXED32_BIT:
         _writeInt32(value);
         break;
-      case PbFieldType._FIXED64_BIT:
+      case PbFieldType.FIXED64_BIT:
         _writeInt64(value);
         break;
-      case PbFieldType._SFIXED32_BIT:
+      case PbFieldType.SFIXED32_BIT:
         _writeInt32(value);
         break;
-      case PbFieldType._SFIXED64_BIT:
+      case PbFieldType.SFIXED64_BIT:
         _writeInt64(value);
         break;
-      case PbFieldType._MESSAGE_BIT:
+      case PbFieldType.MESSAGE_BIT:
         final mark = _startLengthDelimited();
         final GeneratedMessage msg = value;
         msg.writeToCodedBufferWriter(this);
@@ -459,7 +459,7 @@
   ) {
     _writeTag(fieldNumber, wireFormat);
     _writeValueAs(valueType, value);
-    if (valueType == PbFieldType._GROUP_BIT) {
+    if (valueType == PbFieldType.GROUP_BIT) {
       _writeTag(fieldNumber, WIRETYPE_END_GROUP);
     }
   }
diff --git a/protobuf/lib/src/protobuf/extension_registry.dart b/protobuf/lib/src/protobuf/extension_registry.dart
index 2535b49..f7de71a 100644
--- a/protobuf/lib/src/protobuf/extension_registry.dart
+++ b/protobuf/lib/src/protobuf/extension_registry.dart
@@ -181,7 +181,7 @@
       final messageMapDynamic = message._fieldSet._values[field.index!];
       if (messageMapDynamic == null) continue;
       final PbMap messageMap = messageMapDynamic;
-      if (_isGroupOrMessage(field.valueFieldType)) {
+      if (PbFieldType.isGroupOrMessage(field.valueFieldType)) {
         for (final key in messageMap.keys) {
           final GeneratedMessage value = messageMap[key];
           final reparsedValue = _reparseMessage(value, extensionRegistry);
diff --git a/protobuf/lib/src/protobuf/field_error.dart b/protobuf/lib/src/protobuf/field_error.dart
index c3dda12..0381cc7 100644
--- a/protobuf/lib/src/protobuf/field_error.dart
+++ b/protobuf/lib/src/protobuf/field_error.dart
@@ -10,53 +10,53 @@
 /// For enums, group, and message fields, this check is only approximate,
 /// because the exact type isn't included in [fieldType].
 String? _getFieldError(int fieldType, var value) {
-  switch (PbFieldType._baseType(fieldType)) {
-    case PbFieldType._BOOL_BIT:
+  switch (PbFieldType.baseType(fieldType)) {
+    case PbFieldType.BOOL_BIT:
       if (value is! bool) return 'not type bool';
       return null;
-    case PbFieldType._BYTES_BIT:
+    case PbFieldType.BYTES_BIT:
       if (value is! List) return 'not List';
       return null;
-    case PbFieldType._STRING_BIT:
+    case PbFieldType.STRING_BIT:
       if (value is! String) return 'not type String';
       return null;
-    case PbFieldType._FLOAT_BIT:
+    case PbFieldType.FLOAT_BIT:
       if (value is! double) return 'not type double';
       if (!_isFloat32(value)) return 'out of range for float';
       return null;
-    case PbFieldType._DOUBLE_BIT:
+    case PbFieldType.DOUBLE_BIT:
       if (value is! double) return 'not type double';
       return null;
-    case PbFieldType._ENUM_BIT:
+    case PbFieldType.ENUM_BIT:
       if (value is! ProtobufEnum) return 'not type ProtobufEnum';
       return null;
 
-    case PbFieldType._INT32_BIT:
-    case PbFieldType._SINT32_BIT:
-    case PbFieldType._SFIXED32_BIT:
+    case PbFieldType.INT32_BIT:
+    case PbFieldType.SINT32_BIT:
+    case PbFieldType.SFIXED32_BIT:
       if (value is! int) return 'not type int';
       if (!_isSigned32(value)) return 'out of range for signed 32-bit int';
       return null;
 
-    case PbFieldType._UINT32_BIT:
-    case PbFieldType._FIXED32_BIT:
+    case PbFieldType.UINT32_BIT:
+    case PbFieldType.FIXED32_BIT:
       if (value is! int) return 'not type int';
       if (!_isUnsigned32(value)) return 'out of range for unsigned 32-bit int';
       return null;
 
-    case PbFieldType._INT64_BIT:
-    case PbFieldType._SINT64_BIT:
-    case PbFieldType._UINT64_BIT:
-    case PbFieldType._FIXED64_BIT:
-    case PbFieldType._SFIXED64_BIT:
+    case PbFieldType.INT64_BIT:
+    case PbFieldType.SINT64_BIT:
+    case PbFieldType.UINT64_BIT:
+    case PbFieldType.FIXED64_BIT:
+    case PbFieldType.SFIXED64_BIT:
       // We always use the full range of the same Dart type.
       // It's up to the caller to treat the Int64 as signed or unsigned.
       // See: https://github.com/google/protobuf.dart/issues/44
       if (value is! Int64) return 'not Int64';
       return null;
 
-    case PbFieldType._GROUP_BIT:
-    case PbFieldType._MESSAGE_BIT:
+    case PbFieldType.GROUP_BIT:
+    case PbFieldType.MESSAGE_BIT:
       if (value is! GeneratedMessage) return 'not a GeneratedMessage';
       return null;
     default:
@@ -74,33 +74,33 @@
 /// @nodoc
 CheckFunc getCheckFunction(int fieldType) {
   switch (fieldType & ~0x7) {
-    case PbFieldType._BOOL_BIT:
-    case PbFieldType._BYTES_BIT:
-    case PbFieldType._STRING_BIT:
-    case PbFieldType._DOUBLE_BIT:
-    case PbFieldType._ENUM_BIT:
-    case PbFieldType._GROUP_BIT:
-    case PbFieldType._MESSAGE_BIT:
-    case PbFieldType._INT64_BIT:
-    case PbFieldType._SINT64_BIT:
-    case PbFieldType._SFIXED64_BIT:
-    case PbFieldType._UINT64_BIT:
-    case PbFieldType._FIXED64_BIT:
+    case PbFieldType.BOOL_BIT:
+    case PbFieldType.BYTES_BIT:
+    case PbFieldType.STRING_BIT:
+    case PbFieldType.DOUBLE_BIT:
+    case PbFieldType.ENUM_BIT:
+    case PbFieldType.GROUP_BIT:
+    case PbFieldType.MESSAGE_BIT:
+    case PbFieldType.INT64_BIT:
+    case PbFieldType.SINT64_BIT:
+    case PbFieldType.SFIXED64_BIT:
+    case PbFieldType.UINT64_BIT:
+    case PbFieldType.FIXED64_BIT:
       // We always use the full range of the same Dart type.
       // It's up to the caller to treat the Int64 as signed or unsigned.
       // See: https://github.com/google/protobuf.dart/issues/44
       return _checkNotNull;
 
-    case PbFieldType._FLOAT_BIT:
+    case PbFieldType.FLOAT_BIT:
       return _checkFloat;
 
-    case PbFieldType._INT32_BIT:
-    case PbFieldType._SINT32_BIT:
-    case PbFieldType._SFIXED32_BIT:
+    case PbFieldType.INT32_BIT:
+    case PbFieldType.SINT32_BIT:
+    case PbFieldType.SFIXED32_BIT:
       return _checkSigned32;
 
-    case PbFieldType._UINT32_BIT:
-    case PbFieldType._FIXED32_BIT:
+    case PbFieldType.UINT32_BIT:
+    case PbFieldType.FIXED32_BIT:
       return _checkUnsigned32;
   }
   throw ArgumentError('check function not implemented: $fieldType');
diff --git a/protobuf/lib/src/protobuf/field_info.dart b/protobuf/lib/src/protobuf/field_info.dart
index 87d76c2..dbdd7d0 100644
--- a/protobuf/lib/src/protobuf/field_info.dart
+++ b/protobuf/lib/src/protobuf/field_info.dart
@@ -114,9 +114,11 @@
        _protoName = protoName,
        assert(type != 0),
        assert(
-         !_isGroupOrMessage(type) || subBuilder != null || _isMapField(type),
+         !PbFieldType.isGroupOrMessage(type) ||
+             subBuilder != null ||
+             PbFieldType.isMapField(type),
        ),
-       assert(!_isEnum(type) || valueOf != null);
+       assert(!PbFieldType.isEnum(type) || valueOf != null);
 
   // Represents a field that has been removed by a program transformation.
   FieldInfo.dummy(this.index)
@@ -144,8 +146,8 @@
     String? protoName,
   }) : makeDefault = (() => PbList<T>(check: check)),
        _protoName = protoName,
-       assert(_isRepeated(type)),
-       assert(!_isEnum(type) || valueOf != null);
+       assert(PbFieldType.isRepeated(type)),
+       assert(!PbFieldType.isEnum(type) || valueOf != null);
 
   static MakeDefaultFunc? findMakeDefault(int type, dynamic defaultOrMaker) {
     if (defaultOrMaker == null) return PbFieldType.defaultForType(type);
@@ -157,11 +159,11 @@
   /// been removed by a program transformation.
   bool get _isDummy => tagNumber == 0;
 
-  bool get isRequired => _isRequired(type);
-  bool get isRepeated => _isRepeated(type);
-  bool get isGroupOrMessage => _isGroupOrMessage(type);
-  bool get isEnum => _isEnum(type);
-  bool get isMapField => _isMapField(type);
+  bool get isRequired => PbFieldType.isRequired(type);
+  bool get isRepeated => PbFieldType.isRepeated(type);
+  bool get isGroupOrMessage => PbFieldType.isGroupOrMessage(type);
+  bool get isEnum => PbFieldType.isEnum(type);
+  bool get isMapField => PbFieldType.isMapField(type);
 
   /// Returns a read-only default value for a field. Unlike
   /// [GeneratedMessage.getField], doesn't create a repeated field.
@@ -176,7 +178,9 @@
   /// That is, it doesn't contain any required fields that aren't initialized.
   bool _hasRequiredValues(dynamic value) {
     if (value == null) return !isRequired; // missing is okay if optional
-    if (!_isGroupOrMessage(type)) return true; // primitive and present
+    if (!PbFieldType.isGroupOrMessage(type)) {
+      return true; // primitive and present
+    }
 
     if (!isRepeated) {
       // A required message: recurse.
@@ -199,7 +203,7 @@
   void _appendInvalidFields(List<String> problems, value, String prefix) {
     if (value == null) {
       if (isRequired) problems.add('$prefix$name');
-    } else if (!_isGroupOrMessage(type)) {
+    } else if (!PbFieldType.isGroupOrMessage(type)) {
       // primitive and present
     } else if (!isRepeated) {
       // Required message/group: recurse.
@@ -293,7 +297,7 @@
     this.valueCreator, {
     ProtobufEnum? defaultEnumValue,
     String? protoName,
-  }) : assert(_isMapField(type)),
+  }) : assert(PbFieldType.isMapField(type)),
        super(
          name,
          tagNumber,
@@ -303,7 +307,7 @@
          defaultEnumValue: defaultEnumValue,
          protoName: protoName,
        ) {
-    assert(!_isEnum(type) || valueOf != null);
+    assert(!PbFieldType.isEnum(type) || valueOf != null);
   }
 
   FieldInfo get valueFieldInfo =>
diff --git a/protobuf/lib/src/protobuf/field_set.dart b/protobuf/lib/src/protobuf/field_set.dart
index aee73b7..980c03c 100644
--- a/protobuf/lib/src/protobuf/field_set.dart
+++ b/protobuf/lib/src/protobuf/field_set.dart
@@ -626,11 +626,11 @@
     }
 
     hash = HashUtils.combine(hash, fi.tagNumber);
-    if (_isBytes(fi.type)) {
+    if (PbFieldType.isBytes(fi.type)) {
       // Bytes are represented as a List<int> (Usually with byte-data).
       // We special case that to match our equality semantics.
       hash = HashUtils.combine(hash, HashUtils.hashObjects(value));
-    } else if (!_isEnum(fi.type)) {
+    } else if (!PbFieldType.isEnum(fi.type)) {
       hash = HashUtils.combine(hash, value.hashCode);
     } else if (fi.isRepeated) {
       final PbList list = value;
@@ -772,7 +772,7 @@
       final MapFieldInfo<dynamic, dynamic> f = fi as dynamic;
       final PbMap<dynamic, dynamic> map =
           f._ensureMapField(meta, this) as dynamic;
-      if (_isGroupOrMessage(f.valueFieldType)) {
+      if (PbFieldType.isGroupOrMessage(f.valueFieldType)) {
         final PbMap<dynamic, GeneratedMessage> fieldValueMap = fieldValue;
         for (final entry in fieldValueMap.entries) {
           map[entry.key] = entry.value.deepCopy();
@@ -784,7 +784,7 @@
     }
 
     if (fi.isRepeated) {
-      if (_isGroupOrMessage(otherFi.type)) {
+      if (PbFieldType.isGroupOrMessage(otherFi.type)) {
         // fieldValue must be a PbList of GeneratedMessage.
         final PbList<GeneratedMessage> pbList = fieldValue;
         final repeatedFields = fi._ensureRepeatedField(meta, this);
diff --git a/protobuf/lib/src/protobuf/field_type.dart b/protobuf/lib/src/protobuf/field_type.dart
index ad3ac24..67b3194 100644
--- a/protobuf/lib/src/protobuf/field_type.dart
+++ b/protobuf/lib/src/protobuf/field_type.dart
@@ -5,253 +5,254 @@
 // ignore_for_file: constant_identifier_names,non_constant_identifier_names
 part of 'internal.dart';
 
-bool _isRepeated(int fieldType) => (fieldType & PbFieldType._REPEATED_BIT) != 0;
-
-bool _isRequired(int fieldType) => (fieldType & PbFieldType._REQUIRED_BIT) != 0;
-
-bool _isEnum(int fieldType) =>
-    PbFieldType._baseType(fieldType) == PbFieldType._ENUM_BIT;
-
-bool _isBytes(int fieldType) =>
-    PbFieldType._baseType(fieldType) == PbFieldType._BYTES_BIT;
-
-bool _isGroupOrMessage(int fieldType) =>
-    (fieldType & (PbFieldType._GROUP_BIT | PbFieldType._MESSAGE_BIT)) != 0;
-
-bool _isMapField(int fieldType) => (fieldType & PbFieldType._MAP_BIT) != 0;
-
 /// Defines constants and functions for dealing with fieldType bits.
 class PbFieldType {
+  static bool isRepeated(int fieldType) =>
+      (fieldType & PbFieldType.REPEATED_BIT) != 0;
+
+  static bool isRequired(int fieldType) =>
+      (fieldType & PbFieldType.REQUIRED_BIT) != 0;
+
+  static bool isEnum(int fieldType) =>
+      PbFieldType.baseType(fieldType) == PbFieldType.ENUM_BIT;
+
+  static bool isBytes(int fieldType) =>
+      PbFieldType.baseType(fieldType) == PbFieldType.BYTES_BIT;
+
+  static bool isGroupOrMessage(int fieldType) =>
+      (fieldType & (PbFieldType.GROUP_BIT | PbFieldType.MESSAGE_BIT)) != 0;
+
+  static bool isMapField(int fieldType) =>
+      (fieldType & PbFieldType.MAP_BIT) != 0;
+
   /// Returns the base field type without any of the required, repeated
   /// and packed bits.
-  static int _baseType(int fieldType) =>
-      fieldType & ~(_REQUIRED_BIT | _REPEATED_BIT | _PACKED_BIT | _MAP_BIT);
+  static int baseType(int fieldType) =>
+      fieldType & ~(REQUIRED_BIT | REPEATED_BIT | PACKED_BIT | MAP_BIT);
 
   static MakeDefaultFunc? defaultForType(int type) {
     switch (type) {
-      case _OPTIONAL_BOOL:
-      case _REQUIRED_BOOL:
-        return _BOOL_FALSE;
-      case _OPTIONAL_BYTES:
-      case _REQUIRED_BYTES:
-        return _BYTES_EMPTY;
-      case _OPTIONAL_STRING:
-      case _REQUIRED_STRING:
-        return _STRING_EMPTY;
-      case _OPTIONAL_FLOAT:
-      case _REQUIRED_FLOAT:
-      case _OPTIONAL_DOUBLE:
-      case _REQUIRED_DOUBLE:
-        return _DOUBLE_ZERO;
-      case _OPTIONAL_INT32:
-      case _REQUIRED_INT32:
-      case _OPTIONAL_INT64:
-      case _REQUIRED_INT64:
-      case _OPTIONAL_SINT32:
-      case _REQUIRED_SINT32:
-      case _OPTIONAL_SINT64:
-      case _REQUIRED_SINT64:
-      case _OPTIONAL_UINT32:
-      case _REQUIRED_UINT32:
-      case _OPTIONAL_UINT64:
-      case _REQUIRED_UINT64:
-      case _OPTIONAL_FIXED32:
-      case _REQUIRED_FIXED32:
-      case _OPTIONAL_FIXED64:
-      case _REQUIRED_FIXED64:
-      case _OPTIONAL_SFIXED32:
-      case _REQUIRED_SFIXED32:
-      case _OPTIONAL_SFIXED64:
-      case _REQUIRED_SFIXED64:
-        return _INT_ZERO;
+      case OPTIONAL_BOOL:
+      case REQUIRED_BOOL:
+        return BOOL_FALSE;
+      case OPTIONAL_BYTES:
+      case REQUIRED_BYTES:
+        return BYTES_EMPTY;
+      case OPTIONAL_STRING:
+      case REQUIRED_STRING:
+        return STRING_EMPTY;
+      case OPTIONAL_FLOAT:
+      case REQUIRED_FLOAT:
+      case OPTIONAL_DOUBLE:
+      case REQUIRED_DOUBLE:
+        return DOUBLE_ZERO;
+      case OPTIONAL_INT32:
+      case REQUIRED_INT32:
+      case OPTIONAL_INT64:
+      case REQUIRED_INT64:
+      case OPTIONAL_SINT32:
+      case REQUIRED_SINT32:
+      case OPTIONAL_SINT64:
+      case REQUIRED_SINT64:
+      case OPTIONAL_UINT32:
+      case REQUIRED_UINT32:
+      case OPTIONAL_UINT64:
+      case REQUIRED_UINT64:
+      case OPTIONAL_FIXED32:
+      case REQUIRED_FIXED32:
+      case OPTIONAL_FIXED64:
+      case REQUIRED_FIXED64:
+      case OPTIONAL_SFIXED32:
+      case REQUIRED_SFIXED32:
+      case OPTIONAL_SFIXED64:
+      case REQUIRED_SFIXED64:
+        return INT_ZERO;
       default:
         return null;
     }
   }
 
   // Closures commonly used by initializers.
-  static String _STRING_EMPTY() => '';
-  static List<int> _BYTES_EMPTY() => <int>[];
-  static bool _BOOL_FALSE() => false;
-  static int _INT_ZERO() => 0;
-  static double _DOUBLE_ZERO() => 0.0;
+  static String STRING_EMPTY() => '';
+  static List<int> BYTES_EMPTY() => <int>[];
+  static bool BOOL_FALSE() => false;
+  static int INT_ZERO() => 0;
+  static double DOUBLE_ZERO() => 0.0;
 
-  static const int _REQUIRED_BIT = 0x1;
-  static const int _REPEATED_BIT = 0x2;
-  static const int _PACKED_BIT = 0x4;
+  static const int REQUIRED_BIT = 0x1;
+  static const int REPEATED_BIT = 0x2;
+  static const int PACKED_BIT = 0x4;
 
-  static const int _BOOL_BIT = 0x10;
-  static const int _BYTES_BIT = 0x20;
-  static const int _STRING_BIT = 0x40;
-  static const int _DOUBLE_BIT = 0x80;
-  static const int _FLOAT_BIT = 0x100;
-  static const int _ENUM_BIT = 0x200;
-  static const int _GROUP_BIT = 0x400;
-  static const int _INT32_BIT = 0x800;
-  static const int _INT64_BIT = 0x1000;
-  static const int _SINT32_BIT = 0x2000;
-  static const int _SINT64_BIT = 0x4000;
-  static const int _UINT32_BIT = 0x8000;
-  static const int _UINT64_BIT = 0x10000;
-  static const int _FIXED32_BIT = 0x20000;
-  static const int _FIXED64_BIT = 0x40000;
-  static const int _SFIXED32_BIT = 0x80000;
-  static const int _SFIXED64_BIT = 0x100000;
-  static const int _MESSAGE_BIT = 0x200000;
-  static const int _MAP_BIT = 0x400000;
+  static const int BOOL_BIT = 0x10;
+  static const int BYTES_BIT = 0x20;
+  static const int STRING_BIT = 0x40;
+  static const int DOUBLE_BIT = 0x80;
+  static const int FLOAT_BIT = 0x100;
+  static const int ENUM_BIT = 0x200;
+  static const int GROUP_BIT = 0x400;
+  static const int INT32_BIT = 0x800;
+  static const int INT64_BIT = 0x1000;
+  static const int SINT32_BIT = 0x2000;
+  static const int SINT64_BIT = 0x4000;
+  static const int UINT32_BIT = 0x8000;
+  static const int UINT64_BIT = 0x10000;
+  static const int FIXED32_BIT = 0x20000;
+  static const int FIXED64_BIT = 0x40000;
+  static const int SFIXED32_BIT = 0x80000;
+  static const int SFIXED64_BIT = 0x100000;
+  static const int MESSAGE_BIT = 0x200000;
+  static const int MAP_BIT = 0x400000;
 
-  static const int _OPTIONAL_BOOL = _BOOL_BIT;
-  static const int _OPTIONAL_BYTES = _BYTES_BIT;
-  static const int _OPTIONAL_STRING = _STRING_BIT;
-  static const int _OPTIONAL_FLOAT = _FLOAT_BIT;
-  static const int _OPTIONAL_DOUBLE = _DOUBLE_BIT;
-  static const int _OPTIONAL_ENUM = _ENUM_BIT;
-  static const int _OPTIONAL_GROUP = _GROUP_BIT;
-  static const int _OPTIONAL_INT32 = _INT32_BIT;
-  static const int _OPTIONAL_INT64 = _INT64_BIT;
-  static const int _OPTIONAL_SINT32 = _SINT32_BIT;
-  static const int _OPTIONAL_SINT64 = _SINT64_BIT;
-  static const int _OPTIONAL_UINT32 = _UINT32_BIT;
-  static const int _OPTIONAL_UINT64 = _UINT64_BIT;
-  static const int _OPTIONAL_FIXED32 = _FIXED32_BIT;
-  static const int _OPTIONAL_FIXED64 = _FIXED64_BIT;
-  static const int _OPTIONAL_SFIXED32 = _SFIXED32_BIT;
-  static const int _OPTIONAL_SFIXED64 = _SFIXED64_BIT;
-  static const int _OPTIONAL_MESSAGE = _MESSAGE_BIT;
+  static const int OPTIONAL_BOOL = BOOL_BIT;
+  static const int OPTIONAL_BYTES = BYTES_BIT;
+  static const int OPTIONAL_STRING = STRING_BIT;
+  static const int OPTIONAL_FLOAT = FLOAT_BIT;
+  static const int OPTIONAL_DOUBLE = DOUBLE_BIT;
+  static const int OPTIONAL_ENUM = ENUM_BIT;
+  static const int OPTIONAL_GROUP = GROUP_BIT;
+  static const int OPTIONAL_INT32 = INT32_BIT;
+  static const int OPTIONAL_INT64 = INT64_BIT;
+  static const int OPTIONAL_SINT32 = SINT32_BIT;
+  static const int OPTIONAL_SINT64 = SINT64_BIT;
+  static const int OPTIONAL_UINT32 = UINT32_BIT;
+  static const int OPTIONAL_UINT64 = UINT64_BIT;
+  static const int OPTIONAL_FIXED32 = FIXED32_BIT;
+  static const int OPTIONAL_FIXED64 = FIXED64_BIT;
+  static const int OPTIONAL_SFIXED32 = SFIXED32_BIT;
+  static const int OPTIONAL_SFIXED64 = SFIXED64_BIT;
+  static const int OPTIONAL_MESSAGE = MESSAGE_BIT;
 
-  static const int _REQUIRED_BOOL = _REQUIRED_BIT | _BOOL_BIT;
-  static const int _REQUIRED_BYTES = _REQUIRED_BIT | _BYTES_BIT;
-  static const int _REQUIRED_STRING = _REQUIRED_BIT | _STRING_BIT;
-  static const int _REQUIRED_FLOAT = _REQUIRED_BIT | _FLOAT_BIT;
-  static const int _REQUIRED_DOUBLE = _REQUIRED_BIT | _DOUBLE_BIT;
-  static const int _REQUIRED_ENUM = _REQUIRED_BIT | _ENUM_BIT;
-  static const int _REQUIRED_GROUP = _REQUIRED_BIT | _GROUP_BIT;
-  static const int _REQUIRED_INT32 = _REQUIRED_BIT | _INT32_BIT;
-  static const int _REQUIRED_INT64 = _REQUIRED_BIT | _INT64_BIT;
-  static const int _REQUIRED_SINT32 = _REQUIRED_BIT | _SINT32_BIT;
-  static const int _REQUIRED_SINT64 = _REQUIRED_BIT | _SINT64_BIT;
-  static const int _REQUIRED_UINT32 = _REQUIRED_BIT | _UINT32_BIT;
-  static const int _REQUIRED_UINT64 = _REQUIRED_BIT | _UINT64_BIT;
-  static const int _REQUIRED_FIXED32 = _REQUIRED_BIT | _FIXED32_BIT;
-  static const int _REQUIRED_FIXED64 = _REQUIRED_BIT | _FIXED64_BIT;
-  static const int _REQUIRED_SFIXED32 = _REQUIRED_BIT | _SFIXED32_BIT;
-  static const int _REQUIRED_SFIXED64 = _REQUIRED_BIT | _SFIXED64_BIT;
-  static const int _REQUIRED_MESSAGE = _REQUIRED_BIT | _MESSAGE_BIT;
+  static const int REQUIRED_BOOL = REQUIRED_BIT | BOOL_BIT;
+  static const int REQUIRED_BYTES = REQUIRED_BIT | BYTES_BIT;
+  static const int REQUIRED_STRING = REQUIRED_BIT | STRING_BIT;
+  static const int REQUIRED_FLOAT = REQUIRED_BIT | FLOAT_BIT;
+  static const int REQUIRED_DOUBLE = REQUIRED_BIT | DOUBLE_BIT;
+  static const int REQUIRED_ENUM = REQUIRED_BIT | ENUM_BIT;
+  static const int REQUIRED_GROUP = REQUIRED_BIT | GROUP_BIT;
+  static const int REQUIRED_INT32 = REQUIRED_BIT | INT32_BIT;
+  static const int REQUIRED_INT64 = REQUIRED_BIT | INT64_BIT;
+  static const int REQUIRED_SINT32 = REQUIRED_BIT | SINT32_BIT;
+  static const int REQUIRED_SINT64 = REQUIRED_BIT | SINT64_BIT;
+  static const int REQUIRED_UINT32 = REQUIRED_BIT | UINT32_BIT;
+  static const int REQUIRED_UINT64 = REQUIRED_BIT | UINT64_BIT;
+  static const int REQUIRED_FIXED32 = REQUIRED_BIT | FIXED32_BIT;
+  static const int REQUIRED_FIXED64 = REQUIRED_BIT | FIXED64_BIT;
+  static const int REQUIRED_SFIXED32 = REQUIRED_BIT | SFIXED32_BIT;
+  static const int REQUIRED_SFIXED64 = REQUIRED_BIT | SFIXED64_BIT;
+  static const int REQUIRED_MESSAGE = REQUIRED_BIT | MESSAGE_BIT;
 
-  static const int _REPEATED_BOOL = _REPEATED_BIT | _BOOL_BIT;
-  static const int _REPEATED_BYTES = _REPEATED_BIT | _BYTES_BIT;
-  static const int _REPEATED_STRING = _REPEATED_BIT | _STRING_BIT;
-  static const int _REPEATED_FLOAT = _REPEATED_BIT | _FLOAT_BIT;
-  static const int _REPEATED_DOUBLE = _REPEATED_BIT | _DOUBLE_BIT;
-  static const int _REPEATED_ENUM = _REPEATED_BIT | _ENUM_BIT;
-  static const int _REPEATED_GROUP = _REPEATED_BIT | _GROUP_BIT;
-  static const int _REPEATED_INT32 = _REPEATED_BIT | _INT32_BIT;
-  static const int _REPEATED_INT64 = _REPEATED_BIT | _INT64_BIT;
-  static const int _REPEATED_SINT32 = _REPEATED_BIT | _SINT32_BIT;
-  static const int _REPEATED_SINT64 = _REPEATED_BIT | _SINT64_BIT;
-  static const int _REPEATED_UINT32 = _REPEATED_BIT | _UINT32_BIT;
-  static const int _REPEATED_UINT64 = _REPEATED_BIT | _UINT64_BIT;
-  static const int _REPEATED_FIXED32 = _REPEATED_BIT | _FIXED32_BIT;
-  static const int _REPEATED_FIXED64 = _REPEATED_BIT | _FIXED64_BIT;
-  static const int _REPEATED_SFIXED32 = _REPEATED_BIT | _SFIXED32_BIT;
-  static const int _REPEATED_SFIXED64 = _REPEATED_BIT | _SFIXED64_BIT;
-  static const int _REPEATED_MESSAGE = _REPEATED_BIT | _MESSAGE_BIT;
+  static const int REPEATED_BOOL = REPEATED_BIT | BOOL_BIT;
+  static const int REPEATED_BYTES = REPEATED_BIT | BYTES_BIT;
+  static const int REPEATED_STRING = REPEATED_BIT | STRING_BIT;
+  static const int REPEATED_FLOAT = REPEATED_BIT | FLOAT_BIT;
+  static const int REPEATED_DOUBLE = REPEATED_BIT | DOUBLE_BIT;
+  static const int REPEATED_ENUM = REPEATED_BIT | ENUM_BIT;
+  static const int REPEATED_GROUP = REPEATED_BIT | GROUP_BIT;
+  static const int REPEATED_INT32 = REPEATED_BIT | INT32_BIT;
+  static const int REPEATED_INT64 = REPEATED_BIT | INT64_BIT;
+  static const int REPEATED_SINT32 = REPEATED_BIT | SINT32_BIT;
+  static const int REPEATED_SINT64 = REPEATED_BIT | SINT64_BIT;
+  static const int REPEATED_UINT32 = REPEATED_BIT | UINT32_BIT;
+  static const int REPEATED_UINT64 = REPEATED_BIT | UINT64_BIT;
+  static const int REPEATED_FIXED32 = REPEATED_BIT | FIXED32_BIT;
+  static const int REPEATED_FIXED64 = REPEATED_BIT | FIXED64_BIT;
+  static const int REPEATED_SFIXED32 = REPEATED_BIT | SFIXED32_BIT;
+  static const int REPEATED_SFIXED64 = REPEATED_BIT | SFIXED64_BIT;
+  static const int REPEATED_MESSAGE = REPEATED_BIT | MESSAGE_BIT;
 
-  static const int _PACKED_BOOL = _REPEATED_BIT | _PACKED_BIT | _BOOL_BIT;
-  static const int _PACKED_FLOAT = _REPEATED_BIT | _PACKED_BIT | _FLOAT_BIT;
-  static const int _PACKED_DOUBLE = _REPEATED_BIT | _PACKED_BIT | _DOUBLE_BIT;
-  static const int _PACKED_ENUM = _REPEATED_BIT | _PACKED_BIT | _ENUM_BIT;
-  static const int _PACKED_INT32 = _REPEATED_BIT | _PACKED_BIT | _INT32_BIT;
-  static const int _PACKED_INT64 = _REPEATED_BIT | _PACKED_BIT | _INT64_BIT;
-  static const int _PACKED_SINT32 = _REPEATED_BIT | _PACKED_BIT | _SINT32_BIT;
-  static const int _PACKED_SINT64 = _REPEATED_BIT | _PACKED_BIT | _SINT64_BIT;
-  static const int _PACKED_UINT32 = _REPEATED_BIT | _PACKED_BIT | _UINT32_BIT;
-  static const int _PACKED_UINT64 = _REPEATED_BIT | _PACKED_BIT | _UINT64_BIT;
-  static const int _PACKED_FIXED32 = _REPEATED_BIT | _PACKED_BIT | _FIXED32_BIT;
-  static const int _PACKED_FIXED64 = _REPEATED_BIT | _PACKED_BIT | _FIXED64_BIT;
-  static const int _PACKED_SFIXED32 =
-      _REPEATED_BIT | _PACKED_BIT | _SFIXED32_BIT;
-  static const int _PACKED_SFIXED64 =
-      _REPEATED_BIT | _PACKED_BIT | _SFIXED64_BIT;
+  static const int PACKED_BOOL = REPEATED_BIT | PACKED_BIT | BOOL_BIT;
+  static const int PACKED_FLOAT = REPEATED_BIT | PACKED_BIT | FLOAT_BIT;
+  static const int PACKED_DOUBLE = REPEATED_BIT | PACKED_BIT | DOUBLE_BIT;
+  static const int PACKED_ENUM = REPEATED_BIT | PACKED_BIT | ENUM_BIT;
+  static const int PACKED_INT32 = REPEATED_BIT | PACKED_BIT | INT32_BIT;
+  static const int PACKED_INT64 = REPEATED_BIT | PACKED_BIT | INT64_BIT;
+  static const int PACKED_SINT32 = REPEATED_BIT | PACKED_BIT | SINT32_BIT;
+  static const int PACKED_SINT64 = REPEATED_BIT | PACKED_BIT | SINT64_BIT;
+  static const int PACKED_UINT32 = REPEATED_BIT | PACKED_BIT | UINT32_BIT;
+  static const int PACKED_UINT64 = REPEATED_BIT | PACKED_BIT | UINT64_BIT;
+  static const int PACKED_FIXED32 = REPEATED_BIT | PACKED_BIT | FIXED32_BIT;
+  static const int PACKED_FIXED64 = REPEATED_BIT | PACKED_BIT | FIXED64_BIT;
+  static const int PACKED_SFIXED32 = REPEATED_BIT | PACKED_BIT | SFIXED32_BIT;
+  static const int PACKED_SFIXED64 = REPEATED_BIT | PACKED_BIT | SFIXED64_BIT;
 
-  static const int _MAP = _MAP_BIT | _MESSAGE_BIT;
+  static const int MAP = MAP_BIT | MESSAGE_BIT;
   // Short names for use in generated code.
 
   // _O_ptional.
-  static const int OB = _OPTIONAL_BOOL;
-  static const int OY = _OPTIONAL_BYTES;
-  static const int OS = _OPTIONAL_STRING;
-  static const int OF = _OPTIONAL_FLOAT;
-  static const int OD = _OPTIONAL_DOUBLE;
-  static const int OE = _OPTIONAL_ENUM;
-  static const int OG = _OPTIONAL_GROUP;
-  static const int O3 = _OPTIONAL_INT32;
-  static const int O6 = _OPTIONAL_INT64;
-  static const int OS3 = _OPTIONAL_SINT32;
-  static const int OS6 = _OPTIONAL_SINT64;
-  static const int OU3 = _OPTIONAL_UINT32;
-  static const int OU6 = _OPTIONAL_UINT64;
-  static const int OF3 = _OPTIONAL_FIXED32;
-  static const int OF6 = _OPTIONAL_FIXED64;
-  static const int OSF3 = _OPTIONAL_SFIXED32;
-  static const int OSF6 = _OPTIONAL_SFIXED64;
-  static const int OM = _OPTIONAL_MESSAGE;
+  static const int OB = OPTIONAL_BOOL;
+  static const int OY = OPTIONAL_BYTES;
+  static const int OS = OPTIONAL_STRING;
+  static const int OF = OPTIONAL_FLOAT;
+  static const int OD = OPTIONAL_DOUBLE;
+  static const int OE = OPTIONAL_ENUM;
+  static const int OG = OPTIONAL_GROUP;
+  static const int O3 = OPTIONAL_INT32;
+  static const int O6 = OPTIONAL_INT64;
+  static const int OS3 = OPTIONAL_SINT32;
+  static const int OS6 = OPTIONAL_SINT64;
+  static const int OU3 = OPTIONAL_UINT32;
+  static const int OU6 = OPTIONAL_UINT64;
+  static const int OF3 = OPTIONAL_FIXED32;
+  static const int OF6 = OPTIONAL_FIXED64;
+  static const int OSF3 = OPTIONAL_SFIXED32;
+  static const int OSF6 = OPTIONAL_SFIXED64;
+  static const int OM = OPTIONAL_MESSAGE;
 
   // re_Q_uired.
-  static const int QB = _REQUIRED_BOOL;
-  static const int QY = _REQUIRED_BYTES;
-  static const int QS = _REQUIRED_STRING;
-  static const int QF = _REQUIRED_FLOAT;
-  static const int QD = _REQUIRED_DOUBLE;
-  static const int QE = _REQUIRED_ENUM;
-  static const int QG = _REQUIRED_GROUP;
-  static const int Q3 = _REQUIRED_INT32;
-  static const int Q6 = _REQUIRED_INT64;
-  static const int QS3 = _REQUIRED_SINT32;
-  static const int QS6 = _REQUIRED_SINT64;
-  static const int QU3 = _REQUIRED_UINT32;
-  static const int QU6 = _REQUIRED_UINT64;
-  static const int QF3 = _REQUIRED_FIXED32;
-  static const int QF6 = _REQUIRED_FIXED64;
-  static const int QSF3 = _REQUIRED_SFIXED32;
-  static const int QSF6 = _REQUIRED_SFIXED64;
-  static const int QM = _REQUIRED_MESSAGE;
+  static const int QB = REQUIRED_BOOL;
+  static const int QY = REQUIRED_BYTES;
+  static const int QS = REQUIRED_STRING;
+  static const int QF = REQUIRED_FLOAT;
+  static const int QD = REQUIRED_DOUBLE;
+  static const int QE = REQUIRED_ENUM;
+  static const int QG = REQUIRED_GROUP;
+  static const int Q3 = REQUIRED_INT32;
+  static const int Q6 = REQUIRED_INT64;
+  static const int QS3 = REQUIRED_SINT32;
+  static const int QS6 = REQUIRED_SINT64;
+  static const int QU3 = REQUIRED_UINT32;
+  static const int QU6 = REQUIRED_UINT64;
+  static const int QF3 = REQUIRED_FIXED32;
+  static const int QF6 = REQUIRED_FIXED64;
+  static const int QSF3 = REQUIRED_SFIXED32;
+  static const int QSF6 = REQUIRED_SFIXED64;
+  static const int QM = REQUIRED_MESSAGE;
 
   // re_P_eated.
-  static const int PB = _REPEATED_BOOL;
-  static const int PY = _REPEATED_BYTES;
-  static const int PS = _REPEATED_STRING;
-  static const int PF = _REPEATED_FLOAT;
-  static const int PD = _REPEATED_DOUBLE;
-  static const int PE = _REPEATED_ENUM;
-  static const int PG = _REPEATED_GROUP;
-  static const int P3 = _REPEATED_INT32;
-  static const int P6 = _REPEATED_INT64;
-  static const int PS3 = _REPEATED_SINT32;
-  static const int PS6 = _REPEATED_SINT64;
-  static const int PU3 = _REPEATED_UINT32;
-  static const int PU6 = _REPEATED_UINT64;
-  static const int PF3 = _REPEATED_FIXED32;
-  static const int PF6 = _REPEATED_FIXED64;
-  static const int PSF3 = _REPEATED_SFIXED32;
-  static const int PSF6 = _REPEATED_SFIXED64;
-  static const int PM = _REPEATED_MESSAGE;
+  static const int PB = REPEATED_BOOL;
+  static const int PY = REPEATED_BYTES;
+  static const int PS = REPEATED_STRING;
+  static const int PF = REPEATED_FLOAT;
+  static const int PD = REPEATED_DOUBLE;
+  static const int PE = REPEATED_ENUM;
+  static const int PG = REPEATED_GROUP;
+  static const int P3 = REPEATED_INT32;
+  static const int P6 = REPEATED_INT64;
+  static const int PS3 = REPEATED_SINT32;
+  static const int PS6 = REPEATED_SINT64;
+  static const int PU3 = REPEATED_UINT32;
+  static const int PU6 = REPEATED_UINT64;
+  static const int PF3 = REPEATED_FIXED32;
+  static const int PF6 = REPEATED_FIXED64;
+  static const int PSF3 = REPEATED_SFIXED32;
+  static const int PSF6 = REPEATED_SFIXED64;
+  static const int PM = REPEATED_MESSAGE;
 
   // pac_K_ed.
-  static const int KB = _PACKED_BOOL;
-  static const int KE = _PACKED_ENUM;
-  static const int KF = _PACKED_FLOAT;
-  static const int KD = _PACKED_DOUBLE;
-  static const int K3 = _PACKED_INT32;
-  static const int K6 = _PACKED_INT64;
-  static const int KS3 = _PACKED_SINT32;
-  static const int KS6 = _PACKED_SINT64;
-  static const int KU3 = _PACKED_UINT32;
-  static const int KU6 = _PACKED_UINT64;
-  static const int KF3 = _PACKED_FIXED32;
-  static const int KF6 = _PACKED_FIXED64;
-  static const int KSF3 = _PACKED_SFIXED32;
-  static const int KSF6 = _PACKED_SFIXED64;
+  static const int KB = PACKED_BOOL;
+  static const int KE = PACKED_ENUM;
+  static const int KF = PACKED_FLOAT;
+  static const int KD = PACKED_DOUBLE;
+  static const int K3 = PACKED_INT32;
+  static const int K6 = PACKED_INT64;
+  static const int KS3 = PACKED_SINT32;
+  static const int KS6 = PACKED_SINT64;
+  static const int KU3 = PACKED_UINT32;
+  static const int KU6 = PACKED_UINT64;
+  static const int KF3 = PACKED_FIXED32;
+  static const int KF6 = PACKED_FIXED64;
+  static const int KSF3 = PACKED_SFIXED32;
+  static const int KSF6 = PACKED_SFIXED64;
 
-  static const int M = _MAP;
+  static const int M = MAP;
 }
diff --git a/protobuf/lib/src/protobuf/generated_message.dart b/protobuf/lib/src/protobuf/generated_message.dart
index 28f4992..35caa69 100644
--- a/protobuf/lib/src/protobuf/generated_message.dart
+++ b/protobuf/lib/src/protobuf/generated_message.dart
@@ -418,7 +418,7 @@
 
   /// Sets the value of a non-repeated extension field to [value].
   void setExtension(Extension extension, Object value) {
-    if (_isRepeated(extension.type)) {
+    if (PbFieldType.isRepeated(extension.type)) {
       throw ArgumentError(
         _fieldSet._setFieldFailedMessage(
           extension,
diff --git a/protobuf/lib/src/protobuf/json.dart b/protobuf/lib/src/protobuf/json.dart
index f217567..5021fc0 100644
--- a/protobuf/lib/src/protobuf/json.dart
+++ b/protobuf/lib/src/protobuf/json.dart
@@ -6,24 +6,24 @@
 
 Map<String, dynamic> _writeToJsonMap(FieldSet fs) {
   dynamic convertToMap(dynamic fieldValue, int fieldType) {
-    final baseType = PbFieldType._baseType(fieldType);
+    final baseType = PbFieldType.baseType(fieldType);
 
-    if (_isRepeated(fieldType)) {
+    if (PbFieldType.isRepeated(fieldType)) {
       final PbList list = fieldValue;
       return List.from(list.map((e) => convertToMap(e, baseType)));
     }
 
     switch (baseType) {
-      case PbFieldType._BOOL_BIT:
-      case PbFieldType._STRING_BIT:
-      case PbFieldType._INT32_BIT:
-      case PbFieldType._SINT32_BIT:
-      case PbFieldType._UINT32_BIT:
-      case PbFieldType._FIXED32_BIT:
-      case PbFieldType._SFIXED32_BIT:
+      case PbFieldType.BOOL_BIT:
+      case PbFieldType.STRING_BIT:
+      case PbFieldType.INT32_BIT:
+      case PbFieldType.SINT32_BIT:
+      case PbFieldType.UINT32_BIT:
+      case PbFieldType.FIXED32_BIT:
+      case PbFieldType.SFIXED32_BIT:
         return fieldValue;
-      case PbFieldType._FLOAT_BIT:
-      case PbFieldType._DOUBLE_BIT:
+      case PbFieldType.FLOAT_BIT:
+      case PbFieldType.DOUBLE_BIT:
         final value = fieldValue as double;
         if (value.isNaN) {
           return nan;
@@ -35,22 +35,22 @@
           return fieldValue.toInt();
         }
         return value;
-      case PbFieldType._BYTES_BIT:
+      case PbFieldType.BYTES_BIT:
         // Encode 'bytes' as a base64-encoded string.
         return base64Encode(fieldValue as List<int>);
-      case PbFieldType._ENUM_BIT:
+      case PbFieldType.ENUM_BIT:
         final ProtobufEnum enum_ = fieldValue;
         return enum_.value; // assume |value| < 2^52
-      case PbFieldType._INT64_BIT:
-      case PbFieldType._SINT64_BIT:
-      case PbFieldType._SFIXED64_BIT:
+      case PbFieldType.INT64_BIT:
+      case PbFieldType.SINT64_BIT:
+      case PbFieldType.SFIXED64_BIT:
         return fieldValue.toString();
-      case PbFieldType._UINT64_BIT:
-      case PbFieldType._FIXED64_BIT:
+      case PbFieldType.UINT64_BIT:
+      case PbFieldType.FIXED64_BIT:
         final Int64 int_ = fieldValue;
         return int_.toStringUnsigned();
-      case PbFieldType._GROUP_BIT:
-      case PbFieldType._MESSAGE_BIT:
+      case PbFieldType.GROUP_BIT:
+      case PbFieldType.MESSAGE_BIT:
         final GeneratedMessage msg = fieldValue;
         return msg.writeToJsonMap();
       default:
@@ -73,7 +73,7 @@
     if (value == null || (value is List && value.isEmpty)) {
       continue; // It's missing, repeated, or an empty byte array.
     }
-    if (_isMapField(fi.type)) {
+    if (PbFieldType.isMapField(fi.type)) {
       result['${fi.tagNumber}'] = writeMap(
         value,
         fi as MapFieldInfo<dynamic, dynamic>,
@@ -246,8 +246,8 @@
   ExtensionRegistry? registry,
 ) {
   String expectedType; // for exception message
-  switch (PbFieldType._baseType(fieldType)) {
-    case PbFieldType._BOOL_BIT:
+  switch (PbFieldType.baseType(fieldType)) {
+    case PbFieldType.BOOL_BIT:
       if (value is bool) {
         return value;
       } else if (value is String) {
@@ -265,20 +265,20 @@
       }
       expectedType = 'bool (true, false, "true", "false", 1, 0)';
       break;
-    case PbFieldType._BYTES_BIT:
+    case PbFieldType.BYTES_BIT:
       if (value is String) {
         return base64Decode(value);
       }
       expectedType = 'Base64 String';
       break;
-    case PbFieldType._STRING_BIT:
+    case PbFieldType.STRING_BIT:
       if (value is String) {
         return value;
       }
       expectedType = 'String';
       break;
-    case PbFieldType._FLOAT_BIT:
-    case PbFieldType._DOUBLE_BIT:
+    case PbFieldType.FLOAT_BIT:
+    case PbFieldType.DOUBLE_BIT:
       // Allow quoted values, although we don't emit them.
       if (value is double) {
         return value;
@@ -289,7 +289,7 @@
       }
       expectedType = 'num or stringified num';
       break;
-    case PbFieldType._ENUM_BIT:
+    case PbFieldType.ENUM_BIT:
       // Allow quoted values, although we don't emit them.
       if (value is String) {
         value = int.parse(value);
@@ -302,15 +302,15 @@
       }
       expectedType = 'int or stringified int';
       break;
-    case PbFieldType._INT32_BIT:
-    case PbFieldType._SINT32_BIT:
-    case PbFieldType._SFIXED32_BIT:
+    case PbFieldType.INT32_BIT:
+    case PbFieldType.SINT32_BIT:
+    case PbFieldType.SFIXED32_BIT:
       if (value is int) return value;
       if (value is String) return int.parse(value);
       expectedType = 'int or stringified int';
       break;
-    case PbFieldType._UINT32_BIT:
-    case PbFieldType._FIXED32_BIT:
+    case PbFieldType.UINT32_BIT:
+    case PbFieldType.FIXED32_BIT:
       int? validatedValue;
       if (value is int) validatedValue = value;
       if (value is String) validatedValue = int.parse(value);
@@ -320,17 +320,17 @@
       if (validatedValue != null) return validatedValue;
       expectedType = 'int or stringified int';
       break;
-    case PbFieldType._INT64_BIT:
-    case PbFieldType._SINT64_BIT:
-    case PbFieldType._UINT64_BIT:
-    case PbFieldType._FIXED64_BIT:
-    case PbFieldType._SFIXED64_BIT:
+    case PbFieldType.INT64_BIT:
+    case PbFieldType.SINT64_BIT:
+    case PbFieldType.UINT64_BIT:
+    case PbFieldType.FIXED64_BIT:
+    case PbFieldType.SFIXED64_BIT:
       if (value is int) return Int64(value);
       if (value is String) return Int64.parseInt(value);
       expectedType = 'int or stringified int';
       break;
-    case PbFieldType._GROUP_BIT:
-    case PbFieldType._MESSAGE_BIT:
+    case PbFieldType.GROUP_BIT:
+    case PbFieldType.MESSAGE_BIT:
       if (value is Map) {
         final messageValue = value as Map<String, dynamic>;
         final subMessage = meta._makeEmptyMessage(tagNumber, registry);
diff --git a/protobuf/lib/src/protobuf/pb_map.dart b/protobuf/lib/src/protobuf/pb_map.dart
index f9c5379..2816eb6 100644
--- a/protobuf/lib/src/protobuf/pb_map.dart
+++ b/protobuf/lib/src/protobuf/pb_map.dart
@@ -4,6 +4,9 @@
 
 part of 'internal.dart';
 
+const mapKeyFieldNumber = 1;
+const mapValueFieldNumber = 2;
+
 /// A [MapBase] implementation used for protobuf `map` fields.
 class PbMap<K, V> extends MapBase<K, V> {
   /// Key type of the map. Per proto2 and proto3 specs, this needs to be an
@@ -121,7 +124,7 @@
 
   PbMap freeze() {
     _isReadOnly = true;
-    if (_isGroupOrMessage(valueFieldType)) {
+    if (PbFieldType.isGroupOrMessage(valueFieldType)) {
       for (final subMessage in values as Iterable<GeneratedMessage>) {
         subMessage.freeze();
       }
diff --git a/protobuf/lib/src/protobuf/proto3_json.dart b/protobuf/lib/src/protobuf/proto3_json.dart
index c1dbe11..0fe4849 100644
--- a/protobuf/lib/src/protobuf/proto3_json.dart
+++ b/protobuf/lib/src/protobuf/proto3_json.dart
@@ -6,26 +6,26 @@
 
 Object? _writeToProto3Json(FieldSet fs, TypeRegistry typeRegistry) {
   String? convertToMapKey(dynamic key, int keyType) {
-    final baseType = PbFieldType._baseType(keyType);
+    final baseType = PbFieldType.baseType(keyType);
 
-    assert(!_isRepeated(keyType));
+    assert(!PbFieldType.isRepeated(keyType));
 
     switch (baseType) {
-      case PbFieldType._BOOL_BIT:
+      case PbFieldType.BOOL_BIT:
         return key ? 'true' : 'false';
-      case PbFieldType._STRING_BIT:
+      case PbFieldType.STRING_BIT:
         return key;
-      case PbFieldType._UINT64_BIT:
+      case PbFieldType.UINT64_BIT:
         return (key as Int64).toStringUnsigned();
-      case PbFieldType._INT32_BIT:
-      case PbFieldType._SINT32_BIT:
-      case PbFieldType._UINT32_BIT:
-      case PbFieldType._FIXED32_BIT:
-      case PbFieldType._SFIXED32_BIT:
-      case PbFieldType._INT64_BIT:
-      case PbFieldType._SINT64_BIT:
-      case PbFieldType._SFIXED64_BIT:
-      case PbFieldType._FIXED64_BIT:
+      case PbFieldType.INT32_BIT:
+      case PbFieldType.SINT32_BIT:
+      case PbFieldType.UINT32_BIT:
+      case PbFieldType.FIXED32_BIT:
+      case PbFieldType.SFIXED32_BIT:
+      case PbFieldType.INT64_BIT:
+      case PbFieldType.SINT64_BIT:
+      case PbFieldType.SFIXED64_BIT:
+      case PbFieldType.FIXED64_BIT:
         return key.toString();
       default:
         throw StateError('Not a valid key type $keyType');
@@ -35,33 +35,33 @@
   Object? valueToProto3Json(dynamic fieldValue, int? fieldType) {
     if (fieldValue == null) return null;
 
-    if (_isGroupOrMessage(fieldType!)) {
+    if (PbFieldType.isGroupOrMessage(fieldType!)) {
       return _writeToProto3Json(
         (fieldValue as GeneratedMessage)._fieldSet,
         typeRegistry,
       );
-    } else if (_isEnum(fieldType)) {
+    } else if (PbFieldType.isEnum(fieldType)) {
       return (fieldValue as ProtobufEnum).name;
     } else {
-      final baseType = PbFieldType._baseType(fieldType);
+      final baseType = PbFieldType.baseType(fieldType);
       switch (baseType) {
-        case PbFieldType._BOOL_BIT:
+        case PbFieldType.BOOL_BIT:
           return fieldValue as bool;
-        case PbFieldType._STRING_BIT:
+        case PbFieldType.STRING_BIT:
           return fieldValue;
-        case PbFieldType._INT32_BIT:
-        case PbFieldType._SINT32_BIT:
-        case PbFieldType._UINT32_BIT:
-        case PbFieldType._FIXED32_BIT:
-        case PbFieldType._SFIXED32_BIT:
+        case PbFieldType.INT32_BIT:
+        case PbFieldType.SINT32_BIT:
+        case PbFieldType.UINT32_BIT:
+        case PbFieldType.FIXED32_BIT:
+        case PbFieldType.SFIXED32_BIT:
           return fieldValue;
-        case PbFieldType._INT64_BIT:
-        case PbFieldType._SINT64_BIT:
-        case PbFieldType._SFIXED64_BIT:
-        case PbFieldType._FIXED64_BIT:
+        case PbFieldType.INT64_BIT:
+        case PbFieldType.SINT64_BIT:
+        case PbFieldType.SFIXED64_BIT:
+        case PbFieldType.FIXED64_BIT:
           return fieldValue.toString();
-        case PbFieldType._FLOAT_BIT:
-        case PbFieldType._DOUBLE_BIT:
+        case PbFieldType.FLOAT_BIT:
+        case PbFieldType.DOUBLE_BIT:
           final double value = fieldValue;
           if (value.isNaN) {
             return nan;
@@ -73,9 +73,9 @@
             return value.toInt();
           }
           return value;
-        case PbFieldType._UINT64_BIT:
+        case PbFieldType.UINT64_BIT:
           return (fieldValue as Int64).toStringUnsigned();
-        case PbFieldType._BYTES_BIT:
+        case PbFieldType.BYTES_BIT:
           return base64Encode(fieldValue);
         default:
           throw StateError(
@@ -176,13 +176,13 @@
   void recursionHelper(Object? json, FieldSet fieldSet) {
     Object? convertProto3JsonValue(Object value, FieldInfo fieldInfo) {
       final fieldType = fieldInfo.type;
-      switch (PbFieldType._baseType(fieldType)) {
-        case PbFieldType._BOOL_BIT:
+      switch (PbFieldType.baseType(fieldType)) {
+        case PbFieldType.BOOL_BIT:
           if (value is bool) {
             return value;
           }
           throw context.parseException('Expected bool value', json);
-        case PbFieldType._BYTES_BIT:
+        case PbFieldType.BYTES_BIT:
           if (value is String) {
             Uint8List result;
             try {
@@ -199,13 +199,13 @@
             'Expected bytes encoded as base64 String',
             value,
           );
-        case PbFieldType._STRING_BIT:
+        case PbFieldType.STRING_BIT:
           if (value is String) {
             return value;
           }
           throw context.parseException('Expected String value', value);
-        case PbFieldType._FLOAT_BIT:
-        case PbFieldType._DOUBLE_BIT:
+        case PbFieldType.FLOAT_BIT:
+        case PbFieldType.DOUBLE_BIT:
           if (value is double) {
             return value;
           } else if (value is num) {
@@ -221,7 +221,7 @@
             'Expected a double represented as a String or number',
             value,
           );
-        case PbFieldType._ENUM_BIT:
+        case PbFieldType.ENUM_BIT:
           if (value is String) {
             // TODO(sigurdm): Do we want to avoid linear search here? Measure...
             final result =
@@ -245,8 +245,8 @@
             'Expected enum as a string or integer',
             value,
           );
-        case PbFieldType._UINT32_BIT:
-        case PbFieldType._FIXED32_BIT:
+        case PbFieldType.UINT32_BIT:
+        case PbFieldType.FIXED32_BIT:
           int result;
           if (value is int) {
             result = value;
@@ -259,9 +259,9 @@
             );
           }
           return _check32BitUnsignedProto3(result, context);
-        case PbFieldType._INT32_BIT:
-        case PbFieldType._SINT32_BIT:
-        case PbFieldType._SFIXED32_BIT:
+        case PbFieldType.INT32_BIT:
+        case PbFieldType.SINT32_BIT:
+        case PbFieldType.SFIXED32_BIT:
           int result;
           if (value is int) {
             result = value;
@@ -275,7 +275,7 @@
           }
           _check32BitSignedProto3(result, context);
           return result;
-        case PbFieldType._UINT64_BIT:
+        case PbFieldType.UINT64_BIT:
           Int64 result;
           if (value is int) {
             result = Int64(value);
@@ -288,10 +288,10 @@
             );
           }
           return result;
-        case PbFieldType._INT64_BIT:
-        case PbFieldType._SINT64_BIT:
-        case PbFieldType._FIXED64_BIT:
-        case PbFieldType._SFIXED64_BIT:
+        case PbFieldType.INT64_BIT:
+        case PbFieldType.SINT64_BIT:
+        case PbFieldType.FIXED64_BIT:
+        case PbFieldType.SFIXED64_BIT:
           if (value is int) return Int64(value);
           if (value is String) {
             Int64 result;
@@ -309,8 +309,8 @@
             'Expected int or stringified int',
             value,
           );
-        case PbFieldType._GROUP_BIT:
-        case PbFieldType._MESSAGE_BIT:
+        case PbFieldType.GROUP_BIT:
+        case PbFieldType.MESSAGE_BIT:
           final subMessage = fieldInfo.subBuilder!();
           recursionHelper(value, subMessage._fieldSet);
           return subMessage;
@@ -320,8 +320,8 @@
     }
 
     Object decodeMapKey(String key, int fieldType) {
-      switch (PbFieldType._baseType(fieldType)) {
-        case PbFieldType._BOOL_BIT:
+      switch (PbFieldType.baseType(fieldType)) {
+        case PbFieldType.BOOL_BIT:
           switch (key) {
             case 'true':
               return true;
@@ -333,26 +333,26 @@
                 key,
               );
           }
-        case PbFieldType._STRING_BIT:
+        case PbFieldType.STRING_BIT:
           return key;
-        case PbFieldType._UINT64_BIT:
+        case PbFieldType.UINT64_BIT:
           // TODO(sigurdm): We do not throw on negative values here.
           // That would probably require going via bignum.
           return _tryParse64BitProto3(json, key, context);
-        case PbFieldType._INT64_BIT:
-        case PbFieldType._SINT64_BIT:
-        case PbFieldType._SFIXED64_BIT:
-        case PbFieldType._FIXED64_BIT:
+        case PbFieldType.INT64_BIT:
+        case PbFieldType.SINT64_BIT:
+        case PbFieldType.SFIXED64_BIT:
+        case PbFieldType.FIXED64_BIT:
           return _tryParse64BitProto3(json, key, context);
-        case PbFieldType._INT32_BIT:
-        case PbFieldType._SINT32_BIT:
-        case PbFieldType._FIXED32_BIT:
-        case PbFieldType._SFIXED32_BIT:
+        case PbFieldType.INT32_BIT:
+        case PbFieldType.SINT32_BIT:
+        case PbFieldType.FIXED32_BIT:
+        case PbFieldType.SFIXED32_BIT:
           return _check32BitSignedProto3(
             _tryParse32BitProto3(key, context),
             context,
           );
-        case PbFieldType._UINT32_BIT:
+        case PbFieldType.UINT32_BIT:
           return _check32BitUnsignedProto3(
             _tryParse32BitProto3(key, context),
             context,
@@ -400,7 +400,7 @@
             }
           }
 
-          if (_isMapField(fieldInfo.type)) {
+          if (PbFieldType.isMapField(fieldInfo.type)) {
             if (value is Map) {
               final mapFieldInfo = fieldInfo as MapFieldInfo<dynamic, dynamic>;
               final Map fieldValues = fieldSet._ensureMapField(meta, fieldInfo);
@@ -421,7 +421,7 @@
             } else {
               throw context.parseException('Expected a map', value);
             }
-          } else if (_isRepeated(fieldInfo.type)) {
+          } else if (PbFieldType.isRepeated(fieldInfo.type)) {
             if (value is List) {
               final values = fieldSet._ensureRepeatedField(meta, fieldInfo);
               for (var i = 0; i < value.length; i++) {
@@ -433,7 +433,7 @@
             } else {
               throw context.parseException('Expected a list', value);
             }
-          } else if (_isGroupOrMessage(fieldInfo.type)) {
+          } else if (PbFieldType.isGroupOrMessage(fieldInfo.type)) {
             // TODO(sigurdm) consider a cleaner separation between parsing and
             // merging.
             final parsedSubMessage =
diff --git a/protobuf/lib/src/protobuf/unknown_field_set.dart b/protobuf/lib/src/protobuf/unknown_field_set.dart
index 62cee24..196c6b4 100644
--- a/protobuf/lib/src/protobuf/unknown_field_set.dart
+++ b/protobuf/lib/src/protobuf/unknown_field_set.dart
@@ -283,11 +283,11 @@
       output.writeField(fieldNumber, type, value);
     }
 
-    write(PbFieldType._REPEATED_UINT64, varints);
-    write(PbFieldType._REPEATED_FIXED32, fixed32s);
-    write(PbFieldType._REPEATED_FIXED64, fixed64s);
-    write(PbFieldType._REPEATED_BYTES, lengthDelimited);
-    write(PbFieldType._REPEATED_GROUP, groups);
+    write(PbFieldType.REPEATED_UINT64, varints);
+    write(PbFieldType.REPEATED_FIXED32, fixed32s);
+    write(PbFieldType.REPEATED_FIXED64, fixed64s);
+    write(PbFieldType.REPEATED_BYTES, lengthDelimited);
+    write(PbFieldType.REPEATED_GROUP, groups);
   }
 
   void addGroup(UnknownFieldSet value) {
diff --git a/protobuf/lib/src/protobuf/wire_format.dart b/protobuf/lib/src/protobuf/wire_format.dart
index 1dabb63..375ee4b 100644
--- a/protobuf/lib/src/protobuf/wire_format.dart
+++ b/protobuf/lib/src/protobuf/wire_format.dart
@@ -38,32 +38,32 @@
 
 /// Returns true if the wireType can be merged into the given fieldType.
 bool _wireTypeMatches(int fieldType, int wireType) {
-  switch (PbFieldType._baseType(fieldType)) {
-    case PbFieldType._BOOL_BIT:
-    case PbFieldType._ENUM_BIT:
-    case PbFieldType._INT32_BIT:
-    case PbFieldType._INT64_BIT:
-    case PbFieldType._SINT32_BIT:
-    case PbFieldType._SINT64_BIT:
-    case PbFieldType._UINT32_BIT:
-    case PbFieldType._UINT64_BIT:
+  switch (PbFieldType.baseType(fieldType)) {
+    case PbFieldType.BOOL_BIT:
+    case PbFieldType.ENUM_BIT:
+    case PbFieldType.INT32_BIT:
+    case PbFieldType.INT64_BIT:
+    case PbFieldType.SINT32_BIT:
+    case PbFieldType.SINT64_BIT:
+    case PbFieldType.UINT32_BIT:
+    case PbFieldType.UINT64_BIT:
       return wireType == WIRETYPE_VARINT ||
           wireType == WIRETYPE_LENGTH_DELIMITED;
-    case PbFieldType._FLOAT_BIT:
-    case PbFieldType._FIXED32_BIT:
-    case PbFieldType._SFIXED32_BIT:
+    case PbFieldType.FLOAT_BIT:
+    case PbFieldType.FIXED32_BIT:
+    case PbFieldType.SFIXED32_BIT:
       return wireType == WIRETYPE_FIXED32 ||
           wireType == WIRETYPE_LENGTH_DELIMITED;
-    case PbFieldType._DOUBLE_BIT:
-    case PbFieldType._FIXED64_BIT:
-    case PbFieldType._SFIXED64_BIT:
+    case PbFieldType.DOUBLE_BIT:
+    case PbFieldType.FIXED64_BIT:
+    case PbFieldType.SFIXED64_BIT:
       return wireType == WIRETYPE_FIXED64 ||
           wireType == WIRETYPE_LENGTH_DELIMITED;
-    case PbFieldType._BYTES_BIT:
-    case PbFieldType._STRING_BIT:
-    case PbFieldType._MESSAGE_BIT:
+    case PbFieldType.BYTES_BIT:
+    case PbFieldType.STRING_BIT:
+    case PbFieldType.MESSAGE_BIT:
       return wireType == WIRETYPE_LENGTH_DELIMITED;
-    case PbFieldType._GROUP_BIT:
+    case PbFieldType.GROUP_BIT:
       return wireType == WIRETYPE_START_GROUP;
     default:
       return false;