reflect/protoreflect: add Enum.Type and Message.Type

CL/174938 removed these methods in favor of a method that returned
only the descriptors. This CL adds back in the Type methods alongside
the Descriptor methods.

In a vast majority of protobuf usages, only the descriptor information
is needed. However, there is a small percentage that legitimately needs
the Go type information. We should provide both, but document that the
descriptor-only information is preferred.

Change-Id: Ia0a098997fb1bd009994940ae8ea5257ccd87cae
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/184578
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/cmd/protoc-gen-go/internal_gengo/reflect.go b/cmd/protoc-gen-go/internal_gengo/reflect.go
index f0ebaff..df9a8d4 100644
--- a/cmd/protoc-gen-go/internal_gengo/reflect.go
+++ b/cmd/protoc-gen-go/internal_gengo/reflect.go
@@ -280,6 +280,12 @@
 	g.P("}")
 	g.P()
 
+	// Type method.
+	g.P("func (", enum.GoIdent, ") Type() ", protoreflectPackage.Ident("EnumType"), " {")
+	g.P("return &", typesVar, "[", idx, "]")
+	g.P("}")
+	g.P()
+
 	// Number method.
 	g.P("func (x ", enum.GoIdent, ") Number() ", protoreflectPackage.Ident("EnumNumber"), " {")
 	g.P("return ", protoreflectPackage.Ident("EnumNumber"), "(x)")
diff --git a/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go b/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go
index 0929000..09b80e6 100644
--- a/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go
+++ b/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go
@@ -45,6 +45,10 @@
 	return file_annotations_annotations_proto_enumTypes[0].EnumDescriptor
 }
 
+func (AnnotationsTestEnum) Type() protoreflect.EnumType {
+	return &file_annotations_annotations_proto_enumTypes[0]
+}
+
 func (x AnnotationsTestEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
diff --git a/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go.meta b/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go.meta
index ee6a342..ec0ec08 100644
--- a/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go.meta
+++ b/cmd/protoc-gen-go/testdata/annotations/annotations.pb.go.meta
@@ -1 +1 @@
-annotation:{path:5 path:0 source_file:"annotations/annotations.proto" begin:571 end:590} annotation:{path:5 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:607 end:654} annotation:{path:4 path:0 source_file:"annotations/annotations.proto" begin:1761 end:1783} annotation:{path:4 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:1839 end:1859} annotation:{path:4 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:2835 end:2858}
\ No newline at end of file
+annotation:{path:5 path:0 source_file:"annotations/annotations.proto" begin:571 end:590} annotation:{path:5 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:607 end:654} annotation:{path:4 path:0 source_file:"annotations/annotations.proto" begin:1879 end:1901} annotation:{path:4 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:1957 end:1977} annotation:{path:4 path:0 path:2 path:0 source_file:"annotations/annotations.proto" begin:2953 end:2976}
\ No newline at end of file
diff --git a/cmd/protoc-gen-go/testdata/comments/deprecated.pb.go b/cmd/protoc-gen-go/testdata/comments/deprecated.pb.go
index d3aa272..c77af89 100644
--- a/cmd/protoc-gen-go/testdata/comments/deprecated.pb.go
+++ b/cmd/protoc-gen-go/testdata/comments/deprecated.pb.go
@@ -44,6 +44,10 @@
 	return file_comments_deprecated_proto_enumTypes[0].EnumDescriptor
 }
 
+func (DeprecatedEnum) Type() protoreflect.EnumType {
+	return &file_comments_deprecated_proto_enumTypes[0]
+}
+
 func (x DeprecatedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
diff --git a/cmd/protoc-gen-go/testdata/extensions/ext/ext.pb.go b/cmd/protoc-gen-go/testdata/extensions/ext/ext.pb.go
index 4a34578..8972d5e 100644
--- a/cmd/protoc-gen-go/testdata/extensions/ext/ext.pb.go
+++ b/cmd/protoc-gen-go/testdata/extensions/ext/ext.pb.go
@@ -48,6 +48,10 @@
 	return file_extensions_ext_ext_proto_enumTypes[0].EnumDescriptor
 }
 
+func (Enum) Type() protoreflect.EnumType {
+	return &file_extensions_ext_ext_proto_enumTypes[0]
+}
+
 func (x Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
diff --git a/cmd/protoc-gen-go/testdata/extensions/proto3/ext3.pb.go b/cmd/protoc-gen-go/testdata/extensions/proto3/ext3.pb.go
index ed4bbd9..04f050d 100644
--- a/cmd/protoc-gen-go/testdata/extensions/proto3/ext3.pb.go
+++ b/cmd/protoc-gen-go/testdata/extensions/proto3/ext3.pb.go
@@ -47,6 +47,10 @@
 	return file_extensions_proto3_ext3_proto_enumTypes[0].EnumDescriptor
 }
 
+func (Enum) Type() protoreflect.EnumType {
+	return &file_extensions_proto3_ext3_proto_enumTypes[0]
+}
+
 func (x Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
diff --git a/cmd/protoc-gen-go/testdata/import_public/sub/a.pb.go b/cmd/protoc-gen-go/testdata/import_public/sub/a.pb.go
index 2463089..67f63cc 100644
--- a/cmd/protoc-gen-go/testdata/import_public/sub/a.pb.go
+++ b/cmd/protoc-gen-go/testdata/import_public/sub/a.pb.go
@@ -52,6 +52,10 @@
 	return file_import_public_sub_a_proto_enumTypes[0].EnumDescriptor
 }
 
+func (E) Type() protoreflect.EnumType {
+	return &file_import_public_sub_a_proto_enumTypes[0]
+}
+
 func (x E) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -99,6 +103,10 @@
 	return file_import_public_sub_a_proto_enumTypes[1].EnumDescriptor
 }
 
+func (M_Subenum) Type() protoreflect.EnumType {
+	return &file_import_public_sub_a_proto_enumTypes[1]
+}
+
 func (x M_Subenum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -146,6 +154,10 @@
 	return file_import_public_sub_a_proto_enumTypes[2].EnumDescriptor
 }
 
+func (M_Submessage_Submessage_Subenum) Type() protoreflect.EnumType {
+	return &file_import_public_sub_a_proto_enumTypes[2]
+}
+
 func (x M_Submessage_Submessage_Subenum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
diff --git a/cmd/protoc-gen-go/testdata/imports/test_a_1/m1.pb.go b/cmd/protoc-gen-go/testdata/imports/test_a_1/m1.pb.go
index 74d9a94..3310ef1 100644
--- a/cmd/protoc-gen-go/testdata/imports/test_a_1/m1.pb.go
+++ b/cmd/protoc-gen-go/testdata/imports/test_a_1/m1.pb.go
@@ -45,6 +45,10 @@
 	return file_imports_test_a_1_m1_proto_enumTypes[0].EnumDescriptor
 }
 
+func (E1) Type() protoreflect.EnumType {
+	return &file_imports_test_a_1_m1_proto_enumTypes[0]
+}
+
 func (x E1) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
diff --git a/cmd/protoc-gen-go/testdata/nopackage/nopackage.pb.go b/cmd/protoc-gen-go/testdata/nopackage/nopackage.pb.go
index a416a81..3f08447 100644
--- a/cmd/protoc-gen-go/testdata/nopackage/nopackage.pb.go
+++ b/cmd/protoc-gen-go/testdata/nopackage/nopackage.pb.go
@@ -45,6 +45,10 @@
 	return file_nopackage_nopackage_proto_enumTypes[0].EnumDescriptor
 }
 
+func (Enum) Type() protoreflect.EnumType {
+	return &file_nopackage_nopackage_proto_enumTypes[0]
+}
+
 func (x Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
diff --git a/cmd/protoc-gen-go/testdata/proto2/enum.pb.go b/cmd/protoc-gen-go/testdata/proto2/enum.pb.go
index ed0a8c5..7b50b3e 100644
--- a/cmd/protoc-gen-go/testdata/proto2/enum.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto2/enum.pb.go
@@ -51,6 +51,10 @@
 	return file_proto2_enum_proto_enumTypes[0].EnumDescriptor
 }
 
+func (EnumType1) Type() protoreflect.EnumType {
+	return &file_proto2_enum_proto_enumTypes[0]
+}
+
 func (x EnumType1) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -101,6 +105,10 @@
 	return file_proto2_enum_proto_enumTypes[1].EnumDescriptor
 }
 
+func (EnumType2) Type() protoreflect.EnumType {
+	return &file_proto2_enum_proto_enumTypes[1]
+}
+
 func (x EnumType2) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -150,6 +158,10 @@
 	return file_proto2_enum_proto_enumTypes[2].EnumDescriptor
 }
 
+func (EnumContainerMessage1_NestedEnumType1A) Type() protoreflect.EnumType {
+	return &file_proto2_enum_proto_enumTypes[2]
+}
+
 func (x EnumContainerMessage1_NestedEnumType1A) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -197,6 +209,10 @@
 	return file_proto2_enum_proto_enumTypes[3].EnumDescriptor
 }
 
+func (EnumContainerMessage1_NestedEnumType1B) Type() protoreflect.EnumType {
+	return &file_proto2_enum_proto_enumTypes[3]
+}
+
 func (x EnumContainerMessage1_NestedEnumType1B) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -246,6 +262,10 @@
 	return file_proto2_enum_proto_enumTypes[4].EnumDescriptor
 }
 
+func (EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2A) Type() protoreflect.EnumType {
+	return &file_proto2_enum_proto_enumTypes[4]
+}
+
 func (x EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2A) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -293,6 +313,10 @@
 	return file_proto2_enum_proto_enumTypes[5].EnumDescriptor
 }
 
+func (EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2B) Type() protoreflect.EnumType {
+	return &file_proto2_enum_proto_enumTypes[5]
+}
+
 func (x EnumContainerMessage1_EnumContainerMessage2_NestedEnumType2B) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
diff --git a/cmd/protoc-gen-go/testdata/proto2/fields.pb.go b/cmd/protoc-gen-go/testdata/proto2/fields.pb.go
index b2a9c6c..46ecade 100644
--- a/cmd/protoc-gen-go/testdata/proto2/fields.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto2/fields.pb.go
@@ -49,6 +49,10 @@
 	return file_proto2_fields_proto_enumTypes[0].EnumDescriptor
 }
 
+func (FieldTestMessage_Enum) Type() protoreflect.EnumType {
+	return &file_proto2_fields_proto_enumTypes[0]
+}
+
 func (x FieldTestMessage_Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
diff --git a/cmd/protoc-gen-go/testdata/proto3/enum.pb.go b/cmd/protoc-gen-go/testdata/proto3/enum.pb.go
index bca782f..3155a2b 100644
--- a/cmd/protoc-gen-go/testdata/proto3/enum.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto3/enum.pb.go
@@ -51,6 +51,10 @@
 	return file_proto3_enum_proto_enumTypes[0].EnumDescriptor
 }
 
+func (Enum) Type() protoreflect.EnumType {
+	return &file_proto3_enum_proto_enumTypes[0]
+}
+
 func (x Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
diff --git a/cmd/protoc-gen-go/testdata/proto3/fields.pb.go b/cmd/protoc-gen-go/testdata/proto3/fields.pb.go
index 3586968..406b75a 100644
--- a/cmd/protoc-gen-go/testdata/proto3/fields.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto3/fields.pb.go
@@ -45,6 +45,10 @@
 	return file_proto3_fields_proto_enumTypes[0].EnumDescriptor
 }
 
+func (FieldTestMessage_Enum) Type() protoreflect.EnumType {
+	return &file_proto3_fields_proto_enumTypes[0]
+}
+
 func (x FieldTestMessage_Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
diff --git a/encoding/protojson/encode.go b/encoding/protojson/encode.go
index f17d3bb..5128ce4 100644
--- a/encoding/protojson/encode.go
+++ b/encoding/protojson/encode.go
@@ -256,12 +256,11 @@
 		if !fd.IsExtension() {
 			return true
 		}
-		xt := fd.(pref.ExtensionType)
 
 		// If extended type is a MessageSet, set field name to be the message type name.
-		name := xt.Descriptor().FullName()
-		if isMessageSetExtension(xt) {
-			name = xt.Descriptor().Message().FullName()
+		name := fd.FullName()
+		if isMessageSetExtension(fd) {
+			name = fd.Message().FullName()
 		}
 
 		// Use [name] format for JSON field name.
@@ -294,18 +293,17 @@
 }
 
 // isMessageSetExtension reports whether extension extends a message set.
-func isMessageSetExtension(xt pref.ExtensionType) bool {
-	xd := xt.Descriptor()
-	if xd.Name() != "message_set_extension" {
+func isMessageSetExtension(fd pref.FieldDescriptor) bool {
+	if fd.Name() != "message_set_extension" {
 		return false
 	}
-	md := xd.Message()
+	md := fd.Message()
 	if md == nil {
 		return false
 	}
-	if xd.FullName().Parent() != md.FullName() {
+	if fd.FullName().Parent() != md.FullName() {
 		return false
 	}
-	xmd, ok := xd.ContainingMessage().(interface{ IsMessageSet() bool })
+	xmd, ok := fd.ContainingMessage().(interface{ IsMessageSet() bool })
 	return ok && xmd.IsMessageSet()
 }
diff --git a/encoding/protojson/well_known_types.go b/encoding/protojson/well_known_types.go
index 77833d8..e744536 100644
--- a/encoding/protojson/well_known_types.go
+++ b/encoding/protojson/well_known_types.go
@@ -189,7 +189,7 @@
 	// If type of value has custom JSON encoding, marshal out a field "value"
 	// with corresponding custom JSON encoding of the embedded message as a
 	// field.
-	if isCustomType(emt.Descriptor().FullName()) {
+	if isCustomType(emt.FullName()) {
 		o.encoder.WriteName("value")
 		return o.marshalCustomType(em)
 	}
@@ -235,7 +235,7 @@
 
 	// Create new message for the embedded message type and unmarshal into it.
 	em := emt.New()
-	if isCustomType(emt.Descriptor().FullName()) {
+	if isCustomType(emt.FullName()) {
 		// If embedded message is a custom type, unmarshal the JSON "value" field
 		// into it.
 		if err := o.unmarshalAnyValue(em); err != nil {
diff --git a/encoding/prototext/encode.go b/encoding/prototext/encode.go
index 4d73041..7d244a9 100644
--- a/encoding/prototext/encode.go
+++ b/encoding/prototext/encode.go
@@ -252,17 +252,16 @@
 		if !fd.IsExtension() {
 			return true
 		}
-		xt := fd.(pref.ExtensionType)
 
 		// If extended type is a MessageSet, set field name to be the message type name.
-		name := xt.Descriptor().FullName()
-		if isMessageSetExtension(xt) {
-			name = xt.Descriptor().Message().FullName()
+		name := fd.FullName()
+		if isMessageSetExtension(fd) {
+			name = fd.Message().FullName()
 		}
 
 		// Use string type to produce [name] format.
 		tname := text.ValueOf(string(name))
-		entries, err = o.appendField(entries, tname, v, xt)
+		entries, err = o.appendField(entries, tname, v, fd)
 		if err != nil {
 			return false
 		}
@@ -281,19 +280,18 @@
 }
 
 // isMessageSetExtension reports whether extension extends a message set.
-func isMessageSetExtension(xt pref.ExtensionType) bool {
-	xd := xt.Descriptor()
-	if xd.Name() != "message_set_extension" {
+func isMessageSetExtension(fd pref.FieldDescriptor) bool {
+	if fd.Name() != "message_set_extension" {
 		return false
 	}
-	md := xd.Message()
+	md := fd.Message()
 	if md == nil {
 		return false
 	}
-	if xd.FullName().Parent() != md.FullName() {
+	if fd.FullName().Parent() != md.FullName() {
 		return false
 	}
-	xmd, ok := xd.ContainingMessage().(interface{ IsMessageSet() bool })
+	xmd, ok := fd.ContainingMessage().(interface{ IsMessageSet() bool })
 	return ok && xmd.IsMessageSet()
 }
 
diff --git a/encoding/testprotos/pb2/test.pb.go b/encoding/testprotos/pb2/test.pb.go
index a9c102a..a9231e8 100644
--- a/encoding/testprotos/pb2/test.pb.go
+++ b/encoding/testprotos/pb2/test.pb.go
@@ -59,6 +59,10 @@
 	return file_pb2_test_proto_enumTypes[0].EnumDescriptor
 }
 
+func (Enum) Type() protoreflect.EnumType {
+	return &file_pb2_test_proto_enumTypes[0]
+}
+
 func (x Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -112,6 +116,10 @@
 	return file_pb2_test_proto_enumTypes[1].EnumDescriptor
 }
 
+func (Enums_NestedEnum) Type() protoreflect.EnumType {
+	return &file_pb2_test_proto_enumTypes[1]
+}
+
 func (x Enums_NestedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
diff --git a/encoding/testprotos/pb3/test.pb.go b/encoding/testprotos/pb3/test.pb.go
index aaa20e0..56e5e4a 100644
--- a/encoding/testprotos/pb3/test.pb.go
+++ b/encoding/testprotos/pb3/test.pb.go
@@ -54,6 +54,10 @@
 	return file_pb3_test_proto_enumTypes[0].EnumDescriptor
 }
 
+func (Enum) Type() protoreflect.EnumType {
+	return &file_pb3_test_proto_enumTypes[0]
+}
+
 func (x Enum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -100,6 +104,10 @@
 	return file_pb3_test_proto_enumTypes[1].EnumDescriptor
 }
 
+func (Enums_NestedEnum) Type() protoreflect.EnumType {
+	return &file_pb3_test_proto_enumTypes[1]
+}
+
 func (x Enums_NestedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
diff --git a/internal/cmd/generate-types/impl.go b/internal/cmd/generate-types/impl.go
index 938b7f8..a92c7ea 100644
--- a/internal/cmd/generate-types/impl.go
+++ b/internal/cmd/generate-types/impl.go
@@ -437,6 +437,9 @@
 func (m *{{.}}) Descriptor() protoreflect.MessageDescriptor {
 	return m.mi.PBType.Descriptor()
 }
+func (m *{{.}}) Type() protoreflect.MessageType {
+	return m.mi.PBType
+}
 func (m *{{.}}) New() protoreflect.Message {
 	return m.mi.PBType.New()
 }
diff --git a/internal/impl/codec_message.go b/internal/impl/codec_message.go
index e0ebc7e..2b8b047 100644
--- a/internal/impl/codec_message.go
+++ b/internal/impl/codec_message.go
@@ -42,8 +42,8 @@
 	mi.extensionOffset = si.extensionOffset
 
 	mi.coderFields = make(map[wire.Number]*coderFieldInfo)
-	for i := 0; i < mi.PBType.Descriptor().Fields().Len(); i++ {
-		fd := mi.PBType.Descriptor().Fields().Get(i)
+	for i := 0; i < mi.PBType.Fields().Len(); i++ {
+		fd := mi.PBType.Fields().Get(i)
 
 		fs := si.fieldsByNumber[fd.Number()]
 		if fd.ContainingOneof() != nil {
diff --git a/internal/impl/legacy_enum.go b/internal/impl/legacy_enum.go
index e9603e4..3c24eb3 100644
--- a/internal/impl/legacy_enum.go
+++ b/internal/impl/legacy_enum.go
@@ -64,6 +64,9 @@
 func (e *legacyEnumWrapper) Descriptor() pref.EnumDescriptor {
 	return e.pbTyp.Descriptor()
 }
+func (e *legacyEnumWrapper) Type() pref.EnumType {
+	return e.pbTyp
+}
 func (e *legacyEnumWrapper) Number() pref.EnumNumber {
 	return e.num
 }
diff --git a/internal/impl/legacy_extension.go b/internal/impl/legacy_extension.go
index ca3475f..c8b13d8 100644
--- a/internal/impl/legacy_extension.go
+++ b/internal/impl/legacy_extension.go
@@ -65,7 +65,7 @@
 
 	// Determine the parent type if possible.
 	var parent piface.MessageV1
-	messageName := xt.Descriptor().ContainingMessage().FullName()
+	messageName := xt.ContainingMessage().FullName()
 	if mt, _ := preg.GlobalTypes.FindMessageByName(messageName); mt != nil {
 		// Create a new parent message and unwrap it if possible.
 		mv := mt.New().Interface()
@@ -96,7 +96,7 @@
 	// Reconstruct the legacy enum full name, which is an odd mixture of the
 	// proto package name with the Go type name.
 	var enumName string
-	if xt.Descriptor().Kind() == pref.EnumKind {
+	if xt.Kind() == pref.EnumKind {
 		// Derive Go type name.
 		t := extType
 		if t.Kind() == reflect.Ptr || t.Kind() == reflect.Slice {
@@ -107,7 +107,7 @@
 		// Derive the proto package name.
 		// For legacy enums, obtain the proto package from the raw descriptor.
 		var protoPkg string
-		if fd := xt.Descriptor().Enum().ParentFile(); fd != nil {
+		if fd := xt.Enum().ParentFile(); fd != nil {
 			protoPkg = string(fd.Package())
 		}
 		if ed, ok := reflect.Zero(t).Interface().(enumV1); ok && protoPkg == "" {
@@ -122,7 +122,7 @@
 
 	// Derive the proto file that the extension was declared within.
 	var filename string
-	if fd := xt.Descriptor().ParentFile(); fd != nil {
+	if fd := xt.ParentFile(); fd != nil {
 		filename = fd.Path()
 	}
 
@@ -131,9 +131,9 @@
 		Type:          xt,
 		ExtendedType:  parent,
 		ExtensionType: reflect.Zero(extType).Interface(),
-		Field:         int32(xt.Descriptor().Number()),
-		Name:          string(xt.Descriptor().FullName()),
-		Tag:           ptag.Marshal(xt.Descriptor(), enumName),
+		Field:         int32(xt.Number()),
+		Name:          string(xt.FullName()),
+		Tag:           ptag.Marshal(xt, enumName),
 		Filename:      filename,
 	}
 	if d, ok := legacyExtensionDescCache.LoadOrStore(xt, d); ok {
@@ -287,4 +287,4 @@
 func (x *legacyExtensionType) New() pref.Value                      { return x.new() }
 func (x *legacyExtensionType) ValueOf(v interface{}) pref.Value     { return x.valueOf(v) }
 func (x *legacyExtensionType) InterfaceOf(v pref.Value) interface{} { return x.interfaceOf(v) }
-func (x *legacyExtensionType) Format(s fmt.State, r rune)           { descfmt.FormatDesc(s, r, x.Descriptor()) }
+func (x *legacyExtensionType) Format(s fmt.State, r rune)           { descfmt.FormatDesc(s, r, x) }
diff --git a/internal/impl/legacy_test.go b/internal/impl/legacy_test.go
index d22b3d8..10c29b9 100644
--- a/internal/impl/legacy_test.go
+++ b/internal/impl/legacy_test.go
@@ -605,23 +605,23 @@
 
 	var (
 		wantMTA = messageATypes[0]
-		wantMDA = messageATypes[0].Descriptor().Fields().ByNumber(1).Message()
+		wantMDA = messageATypes[0].Fields().ByNumber(1).Message()
 		wantMTB = messageBTypes[0]
-		wantMDB = messageBTypes[0].Descriptor().Fields().ByNumber(2).Message()
-		wantED  = messageATypes[0].Descriptor().Fields().ByNumber(3).Enum()
+		wantMDB = messageBTypes[0].Fields().ByNumber(2).Message()
+		wantED  = messageATypes[0].Fields().ByNumber(3).Enum()
 	)
 
 	for _, gotMT := range messageATypes[1:] {
 		if gotMT != wantMTA {
 			t.Error("MessageType(MessageA) mismatch")
 		}
-		if gotMDA := gotMT.Descriptor().Fields().ByNumber(1).Message(); gotMDA != wantMDA {
+		if gotMDA := gotMT.Fields().ByNumber(1).Message(); gotMDA != wantMDA {
 			t.Error("MessageDescriptor(MessageA) mismatch")
 		}
-		if gotMDB := gotMT.Descriptor().Fields().ByNumber(2).Message(); gotMDB != wantMDB {
+		if gotMDB := gotMT.Fields().ByNumber(2).Message(); gotMDB != wantMDB {
 			t.Error("MessageDescriptor(MessageB) mismatch")
 		}
-		if gotED := gotMT.Descriptor().Fields().ByNumber(3).Enum(); gotED != wantED {
+		if gotED := gotMT.Fields().ByNumber(3).Enum(); gotED != wantED {
 			t.Error("EnumDescriptor(Enum) mismatch")
 		}
 	}
@@ -629,13 +629,13 @@
 		if gotMT != wantMTB {
 			t.Error("MessageType(MessageB) mismatch")
 		}
-		if gotMDA := gotMT.Descriptor().Fields().ByNumber(1).Message(); gotMDA != wantMDA {
+		if gotMDA := gotMT.Fields().ByNumber(1).Message(); gotMDA != wantMDA {
 			t.Error("MessageDescriptor(MessageA) mismatch")
 		}
-		if gotMDB := gotMT.Descriptor().Fields().ByNumber(2).Message(); gotMDB != wantMDB {
+		if gotMDB := gotMT.Fields().ByNumber(2).Message(); gotMDB != wantMDB {
 			t.Error("MessageDescriptor(MessageB) mismatch")
 		}
-		if gotED := gotMT.Descriptor().Fields().ByNumber(3).Enum(); gotED != wantED {
+		if gotED := gotMT.Fields().ByNumber(3).Enum(); gotED != wantED {
 			t.Error("EnumDescriptor(Enum) mismatch")
 		}
 	}
diff --git a/internal/impl/message.go b/internal/impl/message.go
index 09e91ed..2e8d185 100644
--- a/internal/impl/message.go
+++ b/internal/impl/message.go
@@ -224,8 +224,8 @@
 // any discrepancies.
 func (mi *MessageInfo) makeKnownFieldsFunc(si structInfo) {
 	mi.fields = map[pref.FieldNumber]*fieldInfo{}
-	for i := 0; i < mi.PBType.Descriptor().Fields().Len(); i++ {
-		fd := mi.PBType.Descriptor().Fields().Get(i)
+	for i := 0; i < mi.PBType.Fields().Len(); i++ {
+		fd := mi.PBType.Fields().Get(i)
 		fs := si.fieldsByNumber[fd.Number()]
 		var fi fieldInfo
 		switch {
@@ -244,8 +244,8 @@
 	}
 
 	mi.oneofs = map[pref.Name]*oneofInfo{}
-	for i := 0; i < mi.PBType.Descriptor().Oneofs().Len(); i++ {
-		od := mi.PBType.Descriptor().Oneofs().Get(i)
+	for i := 0; i < mi.PBType.Oneofs().Len(); i++ {
+		od := mi.PBType.Oneofs().Get(i)
 		mi.oneofs[od.Name()] = makeOneofInfo(od, si.oneofsByName[od.Name()], mi.Exporter, si.oneofWrappersByType)
 	}
 }
diff --git a/internal/impl/message_reflect_gen.go b/internal/impl/message_reflect_gen.go
index efe4e89..483484b 100644
--- a/internal/impl/message_reflect_gen.go
+++ b/internal/impl/message_reflect_gen.go
@@ -14,6 +14,9 @@
 func (m *messageState) Descriptor() protoreflect.MessageDescriptor {
 	return m.mi.PBType.Descriptor()
 }
+func (m *messageState) Type() protoreflect.MessageType {
+	return m.mi.PBType
+}
 func (m *messageState) New() protoreflect.Message {
 	return m.mi.PBType.New()
 }
@@ -106,6 +109,9 @@
 func (m *messageReflectWrapper) Descriptor() protoreflect.MessageDescriptor {
 	return m.mi.PBType.Descriptor()
 }
+func (m *messageReflectWrapper) Type() protoreflect.MessageType {
+	return m.mi.PBType
+}
 func (m *messageReflectWrapper) New() protoreflect.Message {
 	return m.mi.PBType.New()
 }
diff --git a/internal/impl/message_test.go b/internal/impl/message_test.go
index 75c4460..0fb8ae0 100644
--- a/internal/impl/message_test.go
+++ b/internal/impl/message_test.go
@@ -963,6 +963,7 @@
 }
 
 func (e EnumProto2) Descriptor() pref.EnumDescriptor { return enumProto2Type.Descriptor() }
+func (e EnumProto2) Type() pref.EnumType             { return enumProto2Type }
 func (e EnumProto2) Enum() *EnumProto2               { return &e }
 func (e EnumProto2) Number() pref.EnumNumber         { return pref.EnumNumber(e) }
 
@@ -979,6 +980,7 @@
 }
 
 func (e EnumProto3) Descriptor() pref.EnumDescriptor { return enumProto3Type.Descriptor() }
+func (e EnumProto3) Type() pref.EnumType             { return enumProto3Type }
 func (e EnumProto3) Enum() *EnumProto3               { return &e }
 func (e EnumProto3) Number() pref.EnumNumber         { return pref.EnumNumber(e) }
 
diff --git a/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_8.pb.go b/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_8.pb.go
index b91f7dc..6840a38 100644
--- a/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_8.pb.go
+++ b/internal/testprotos/benchmarks/datasets/google_message3/benchmark_message3_8.pb.go
@@ -48,6 +48,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[0].EnumDescriptor
 }
 
+func (Enum720) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[0]
+}
+
 func (x Enum720) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -644,6 +648,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[1].EnumDescriptor
 }
 
+func (Enum3476) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[1]
+}
+
 func (x Enum3476) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -724,6 +732,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[2].EnumDescriptor
 }
 
+func (Enum3805) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[2]
+}
+
 func (x Enum3805) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -828,6 +840,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[3].EnumDescriptor
 }
 
+func (Enum3783) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[3]
+}
+
 func (x Enum3783) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -926,6 +942,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[4].EnumDescriptor
 }
 
+func (Enum3851) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[4]
+}
+
 func (x Enum3851) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -976,6 +996,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[5].EnumDescriptor
 }
 
+func (UnusedEnum) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[5]
+}
+
 func (x UnusedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1035,6 +1059,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[6].EnumDescriptor
 }
 
+func (Enum4146) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[6]
+}
+
 func (x Enum4146) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1085,6 +1113,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[7].EnumDescriptor
 }
 
+func (Enum4160) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[7]
+}
+
 func (x Enum4160) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1150,6 +1182,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[8].EnumDescriptor
 }
 
+func (Enum4152) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[8]
+}
+
 func (x Enum4152) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1260,6 +1296,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[9].EnumDescriptor
 }
 
+func (Enum6025) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[9]
+}
+
 func (x Enum6025) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1349,6 +1389,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[10].EnumDescriptor
 }
 
+func (Enum6065) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[10]
+}
+
 func (x Enum6065) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1417,6 +1461,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[11].EnumDescriptor
 }
 
+func (Enum6579) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[11]
+}
+
 func (x Enum6579) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1563,6 +1611,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[12].EnumDescriptor
 }
 
+func (Enum6588) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[12]
+}
+
 func (x Enum6588) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1616,6 +1668,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[13].EnumDescriptor
 }
 
+func (Enum6769) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[13]
+}
+
 func (x Enum6769) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1681,6 +1737,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[14].EnumDescriptor
 }
 
+func (Enum6774) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[14]
+}
+
 func (x Enum6774) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1743,6 +1803,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[15].EnumDescriptor
 }
 
+func (Enum6782) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[15]
+}
+
 func (x Enum6782) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1799,6 +1863,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[16].EnumDescriptor
 }
 
+func (Enum6858) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[16]
+}
+
 func (x Enum6858) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1861,6 +1929,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[17].EnumDescriptor
 }
 
+func (Enum6815) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[17]
+}
+
 func (x Enum6815) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1917,6 +1989,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[18].EnumDescriptor
 }
 
+func (Enum6822) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[18]
+}
+
 func (x Enum6822) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1970,6 +2046,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[19].EnumDescriptor
 }
 
+func (Enum7654) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[19]
+}
+
 func (x Enum7654) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2023,6 +2103,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[20].EnumDescriptor
 }
 
+func (Enum8292) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[20]
+}
+
 func (x Enum8292) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2076,6 +2160,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[21].EnumDescriptor
 }
 
+func (Enum8450) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[21]
+}
+
 func (x Enum8450) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2135,6 +2223,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[22].EnumDescriptor
 }
 
+func (Enum8900) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[22]
+}
+
 func (x Enum8900) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2194,6 +2286,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[23].EnumDescriptor
 }
 
+func (Enum8945) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[23]
+}
+
 func (x Enum8945) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2262,6 +2358,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[24].EnumDescriptor
 }
 
+func (Enum8951) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[24]
+}
+
 func (x Enum8951) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2555,6 +2655,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[25].EnumDescriptor
 }
 
+func (Enum9243) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[25]
+}
+
 func (x Enum9243) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2626,6 +2730,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[26].EnumDescriptor
 }
 
+func (Enum10157) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[26]
+}
+
 func (x Enum10157) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2697,6 +2805,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[27].EnumDescriptor
 }
 
+func (Enum10167) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[27]
+}
+
 func (x Enum10167) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2789,6 +2901,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[28].EnumDescriptor
 }
 
+func (Enum8862) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[28]
+}
+
 func (x Enum8862) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2860,6 +2976,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[29].EnumDescriptor
 }
 
+func (Enum10325) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[29]
+}
+
 func (x Enum10325) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2907,6 +3027,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[30].EnumDescriptor
 }
 
+func (Enum10335) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[30]
+}
+
 func (x Enum10335) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2957,6 +3081,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[31].EnumDescriptor
 }
 
+func (Enum10337) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[31]
+}
+
 func (x Enum10337) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -3055,6 +3183,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[32].EnumDescriptor
 }
 
+func (Enum10392) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[32]
+}
+
 func (x Enum10392) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -4179,6 +4311,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[33].EnumDescriptor
 }
 
+func (Enum11107) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[33]
+}
+
 func (x Enum11107) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -4796,6 +4932,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[34].EnumDescriptor
 }
 
+func (Enum11541) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[34]
+}
+
 func (x Enum11541) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -4912,6 +5052,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[35].EnumDescriptor
 }
 
+func (Enum11468) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[35]
+}
+
 func (x Enum11468) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -5208,6 +5352,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[36].EnumDescriptor
 }
 
+func (Enum11022) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[36]
+}
+
 func (x Enum11022) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -5261,6 +5409,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[37].EnumDescriptor
 }
 
+func (Enum12670) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[37]
+}
+
 func (x Enum12670) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -5323,6 +5475,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[38].EnumDescriptor
 }
 
+func (Enum12871) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[38]
+}
+
 func (x Enum12871) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -5376,6 +5532,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[39].EnumDescriptor
 }
 
+func (Enum13092) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[39]
+}
+
 func (x Enum13092) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -5432,6 +5592,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[40].EnumDescriptor
 }
 
+func (Enum13146) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[40]
+}
+
 func (x Enum13146) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -6562,6 +6726,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[41].EnumDescriptor
 }
 
+func (Enum16042) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[41]
+}
+
 func (x Enum16042) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -6636,6 +6804,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[42].EnumDescriptor
 }
 
+func (Enum16553) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[42]
+}
+
 func (x Enum16553) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -6689,6 +6861,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[43].EnumDescriptor
 }
 
+func (Enum16728) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[43]
+}
+
 func (x Enum16728) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -6748,6 +6924,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[44].EnumDescriptor
 }
 
+func (Enum16732) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[44]
+}
+
 func (x Enum16732) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -6813,6 +6993,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[45].EnumDescriptor
 }
 
+func (Enum16738) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[45]
+}
+
 func (x Enum16738) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -6926,6 +7110,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[46].EnumDescriptor
 }
 
+func (Enum16698) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[46]
+}
+
 func (x Enum16698) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -6988,6 +7176,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[47].EnumDescriptor
 }
 
+func (Enum16819) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[47]
+}
+
 func (x Enum16819) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -7074,6 +7266,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[48].EnumDescriptor
 }
 
+func (Enum16925) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[48]
+}
+
 func (x Enum16925) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -7124,6 +7320,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[49].EnumDescriptor
 }
 
+func (Enum22854) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[49]
+}
+
 func (x Enum22854) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -7180,6 +7380,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[50].EnumDescriptor
 }
 
+func (Enum24361) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[50]
+}
+
 func (x Enum24361) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -7320,6 +7524,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[51].EnumDescriptor
 }
 
+func (Enum16891) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[51]
+}
+
 func (x Enum16891) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -7379,6 +7587,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[52].EnumDescriptor
 }
 
+func (Enum27361) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[52]
+}
+
 func (x Enum27361) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -7444,6 +7656,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[53].EnumDescriptor
 }
 
+func (Enum33960) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[53]
+}
+
 func (x Enum33960) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -7491,6 +7707,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[54].EnumDescriptor
 }
 
+func (Enum34388) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[54]
+}
+
 func (x Enum34388) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -7550,6 +7770,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[55].EnumDescriptor
 }
 
+func (Enum35477) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[55]
+}
+
 func (x Enum35477) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -7624,6 +7848,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[56].EnumDescriptor
 }
 
+func (Enum35507) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[56]
+}
+
 func (x Enum35507) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -7692,6 +7920,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[57].EnumDescriptor
 }
 
+func (Enum36860) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[57]
+}
+
 func (x Enum36860) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -7742,6 +7974,10 @@
 	return file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[58].EnumDescriptor
 }
 
+func (Enum36890) Type() protoreflect.EnumType {
+	return &file_datasets_google_message3_benchmark_message3_8_proto_enumTypes[58]
+}
+
 func (x Enum36890) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
diff --git a/internal/testprotos/benchmarks/datasets/google_message4/benchmark_message4_3.pb.go b/internal/testprotos/benchmarks/datasets/google_message4/benchmark_message4_3.pb.go
index 87ce439..263e9b4 100644
--- a/internal/testprotos/benchmarks/datasets/google_message4/benchmark_message4_3.pb.go
+++ b/internal/testprotos/benchmarks/datasets/google_message4/benchmark_message4_3.pb.go
@@ -48,6 +48,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[0].EnumDescriptor
 }
 
+func (UnusedEnum) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[0]
+}
+
 func (x UnusedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -116,6 +120,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[1].EnumDescriptor
 }
 
+func (Enum2593) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[1]
+}
+
 func (x Enum2593) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -169,6 +177,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[2].EnumDescriptor
 }
 
+func (Enum2834) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[2]
+}
+
 func (x Enum2834) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -258,6 +270,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[3].EnumDescriptor
 }
 
+func (Enum2806) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[3]
+}
+
 func (x Enum2806) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -665,6 +681,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[4].EnumDescriptor
 }
 
+func (Enum2851) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[4]
+}
+
 func (x Enum2851) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -745,6 +765,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[5].EnumDescriptor
 }
 
+func (Enum2602) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[5]
+}
+
 func (x Enum2602) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -873,6 +897,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[6].EnumDescriptor
 }
 
+func (Enum3071) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[6]
+}
+
 func (x Enum3071) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -953,6 +981,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[7].EnumDescriptor
 }
 
+func (Enum3805) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[7]
+}
+
 func (x Enum3805) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1057,6 +1089,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[8].EnumDescriptor
 }
 
+func (Enum3783) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[8]
+}
+
 func (x Enum3783) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1155,6 +1191,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[9].EnumDescriptor
 }
 
+func (Enum3851) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[9]
+}
+
 func (x Enum3851) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1208,6 +1248,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[10].EnumDescriptor
 }
 
+func (Enum5862) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[10]
+}
+
 func (x Enum5862) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1264,6 +1308,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[11].EnumDescriptor
 }
 
+func (Enum5868) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[11]
+}
+
 func (x Enum5868) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1317,6 +1365,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[12].EnumDescriptor
 }
 
+func (Enum5873) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[12]
+}
+
 func (x Enum5873) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1367,6 +1419,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[13].EnumDescriptor
 }
 
+func (Enum5904) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[13]
+}
+
 func (x Enum5904) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1417,6 +1473,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[14].EnumDescriptor
 }
 
+func (Enum5909) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[14]
+}
+
 func (x Enum5909) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1467,6 +1527,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[15].EnumDescriptor
 }
 
+func (Enum5912) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[15]
+}
+
 func (x Enum5912) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1523,6 +1587,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[16].EnumDescriptor
 }
 
+func (Enum5915) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[16]
+}
+
 func (x Enum5915) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1573,6 +1641,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[17].EnumDescriptor
 }
 
+func (Enum5920) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[17]
+}
+
 func (x Enum5920) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1629,6 +1701,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[18].EnumDescriptor
 }
 
+func (Enum5923) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[18]
+}
+
 func (x Enum5923) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1679,6 +1755,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[19].EnumDescriptor
 }
 
+func (Enum5928) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[19]
+}
+
 func (x Enum5928) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1732,6 +1812,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[20].EnumDescriptor
 }
 
+func (Enum5931) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[20]
+}
+
 func (x Enum5931) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1785,6 +1869,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[21].EnumDescriptor
 }
 
+func (Enum5935) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[21]
+}
+
 func (x Enum5935) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1847,6 +1935,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[22].EnumDescriptor
 }
 
+func (Enum5939) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[22]
+}
+
 func (x Enum5939) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1921,6 +2013,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[23].EnumDescriptor
 }
 
+func (Enum5946) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[23]
+}
+
 func (x Enum5946) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -1977,6 +2073,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[24].EnumDescriptor
 }
 
+func (Enum5957) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[24]
+}
+
 func (x Enum5957) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2027,6 +2127,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[25].EnumDescriptor
 }
 
+func (Enum5962) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[25]
+}
+
 func (x Enum5962) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2137,6 +2241,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[26].EnumDescriptor
 }
 
+func (Enum6025) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[26]
+}
+
 func (x Enum6025) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2223,6 +2331,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[27].EnumDescriptor
 }
 
+func (Enum6111) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[27]
+}
+
 func (x Enum6111) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2312,6 +2424,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[28].EnumDescriptor
 }
 
+func (Enum6065) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[28]
+}
+
 func (x Enum6065) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2362,6 +2478,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[29].EnumDescriptor
 }
 
+func (Enum6130) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[29]
+}
+
 func (x Enum6130) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2430,6 +2550,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[30].EnumDescriptor
 }
 
+func (Enum6579) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[30]
+}
+
 func (x Enum6579) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2576,6 +2700,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[31].EnumDescriptor
 }
 
+func (Enum6588) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[31]
+}
+
 func (x Enum6588) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2632,6 +2760,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[32].EnumDescriptor
 }
 
+func (Enum7288) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[32]
+}
+
 func (x Enum7288) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2700,6 +2832,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[33].EnumDescriptor
 }
 
+func (Enum7512) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[33]
+}
+
 func (x Enum7512) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -2759,6 +2895,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[34].EnumDescriptor
 }
 
+func (Enum7922) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[34]
+}
+
 func (x Enum7922) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -3355,6 +3495,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[35].EnumDescriptor
 }
 
+func (Enum3476) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[35]
+}
+
 func (x Enum3476) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -3426,6 +3570,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[36].EnumDescriptor
 }
 
+func (Enum10325) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[36]
+}
+
 func (x Enum10325) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -3473,6 +3621,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[37].EnumDescriptor
 }
 
+func (Enum10335) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[37]
+}
+
 func (x Enum10335) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -3523,6 +3675,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[38].EnumDescriptor
 }
 
+func (Enum10337) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[38]
+}
+
 func (x Enum10337) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -3579,6 +3735,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[39].EnumDescriptor
 }
 
+func (Enum11901) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[39]
+}
+
 func (x Enum11901) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -3635,6 +3795,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[40].EnumDescriptor
 }
 
+func (Enum12735) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[40]
+}
+
 func (x Enum12735) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -3697,6 +3861,10 @@
 	return file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[41].EnumDescriptor
 }
 
+func (Enum12871) Type() protoreflect.EnumType {
+	return &file_datasets_google_message4_benchmark_message4_3_proto_enumTypes[41]
+}
+
 func (x Enum12871) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
diff --git a/internal/testprotos/conformance/conformance.pb.go b/internal/testprotos/conformance/conformance.pb.go
index 85da0fb..f63df25 100644
--- a/internal/testprotos/conformance/conformance.pb.go
+++ b/internal/testprotos/conformance/conformance.pb.go
@@ -57,6 +57,10 @@
 	return file_conformance_conformance_proto_enumTypes[0].EnumDescriptor
 }
 
+func (WireFormat) Type() protoreflect.EnumType {
+	return &file_conformance_conformance_proto_enumTypes[0]
+}
+
 func (x WireFormat) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -117,6 +121,10 @@
 	return file_conformance_conformance_proto_enumTypes[1].EnumDescriptor
 }
 
+func (TestCategory) Type() protoreflect.EnumType {
+	return &file_conformance_conformance_proto_enumTypes[1]
+}
+
 func (x TestCategory) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
diff --git a/internal/testprotos/conformance/test_messages_proto2.pb.go b/internal/testprotos/conformance/test_messages_proto2.pb.go
index 4cfebae..91d70be 100644
--- a/internal/testprotos/conformance/test_messages_proto2.pb.go
+++ b/internal/testprotos/conformance/test_messages_proto2.pb.go
@@ -52,6 +52,10 @@
 	return file_google_protobuf_test_messages_proto2_proto_enumTypes[0].EnumDescriptor
 }
 
+func (ForeignEnumProto2) Type() protoreflect.EnumType {
+	return &file_google_protobuf_test_messages_proto2_proto_enumTypes[0]
+}
+
 func (x ForeignEnumProto2) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -108,6 +112,10 @@
 	return file_google_protobuf_test_messages_proto2_proto_enumTypes[1].EnumDescriptor
 }
 
+func (TestAllTypesProto2_NestedEnum) Type() protoreflect.EnumType {
+	return &file_google_protobuf_test_messages_proto2_proto_enumTypes[1]
+}
+
 func (x TestAllTypesProto2_NestedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
diff --git a/internal/testprotos/conformance/test_messages_proto3.pb.go b/internal/testprotos/conformance/test_messages_proto3.pb.go
index 2462913..8cf6e00 100644
--- a/internal/testprotos/conformance/test_messages_proto3.pb.go
+++ b/internal/testprotos/conformance/test_messages_proto3.pb.go
@@ -57,6 +57,10 @@
 	return file_google_protobuf_test_messages_proto3_proto_enumTypes[0].EnumDescriptor
 }
 
+func (ForeignEnum) Type() protoreflect.EnumType {
+	return &file_google_protobuf_test_messages_proto3_proto_enumTypes[0]
+}
+
 func (x ForeignEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -103,6 +107,10 @@
 	return file_google_protobuf_test_messages_proto3_proto_enumTypes[1].EnumDescriptor
 }
 
+func (TestAllTypesProto3_NestedEnum) Type() protoreflect.EnumType {
+	return &file_google_protobuf_test_messages_proto3_proto_enumTypes[1]
+}
+
 func (x TestAllTypesProto3_NestedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -155,6 +163,10 @@
 	return file_google_protobuf_test_messages_proto3_proto_enumTypes[2].EnumDescriptor
 }
 
+func (TestAllTypesProto3_AliasedEnum) Type() protoreflect.EnumType {
+	return &file_google_protobuf_test_messages_proto3_proto_enumTypes[2]
+}
+
 func (x TestAllTypesProto3_AliasedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
diff --git a/internal/testprotos/irregular/irregular.go b/internal/testprotos/irregular/irregular.go
index 6685e43..5026b15 100644
--- a/internal/testprotos/irregular/irregular.go
+++ b/internal/testprotos/irregular/irregular.go
@@ -8,6 +8,8 @@
 	"google.golang.org/protobuf/encoding/prototext"
 	"google.golang.org/protobuf/reflect/protodesc"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
+	"google.golang.org/protobuf/reflect/prototype"
+
 	"google.golang.org/protobuf/types/descriptorpb"
 )
 
@@ -20,11 +22,19 @@
 
 type message IrregularMessage
 
-func (m *message) Descriptor() pref.MessageDescriptor { return descriptor.Messages().Get(0) }
+var messageType = &prototype.Message{
+	MessageDescriptor: fileDesc.Messages().Get(0),
+	NewMessage: func() pref.Message {
+		return &message{}
+	},
+}
+
+func (m *message) Descriptor() pref.MessageDescriptor { return messageType.Descriptor() }
+func (m *message) Type() pref.MessageType             { return messageType }
 func (m *message) New() pref.Message                  { return &message{} }
 func (m *message) Interface() pref.ProtoMessage       { return (*IrregularMessage)(m) }
 
-var fieldDescS = descriptor.Messages().Get(0).Fields().Get(0)
+var fieldDescS = fileDesc.Messages().Get(0).Fields().Get(0)
 
 func (m *message) Range(f func(pref.FieldDescriptor, pref.Value) bool) {
 	if m.set {
@@ -79,7 +89,7 @@
 func (m *message) GetUnknown() pref.RawFields { return nil }
 func (m *message) SetUnknown(pref.RawFields)  { return }
 
-var descriptor = func() pref.FileDescriptor {
+var fileDesc = func() pref.FileDescriptor {
 	p := &descriptorpb.FileDescriptorProto{}
 	if err := prototext.Unmarshal([]byte(descriptorText), p); err != nil {
 		panic(err)
@@ -91,7 +101,7 @@
 	return file
 }()
 
-func file_irregular_irregular_proto_init() { _ = descriptor }
+func file_irregular_irregular_proto_init() { _ = fileDesc }
 
 const descriptorText = `
   name: "internal/testprotos/irregular/irregular.proto"
diff --git a/internal/testprotos/test/test.pb.go b/internal/testprotos/test/test.pb.go
index 83d9cdc..3906267 100644
--- a/internal/testprotos/test/test.pb.go
+++ b/internal/testprotos/test/test.pb.go
@@ -53,6 +53,10 @@
 	return file_test_test_proto_enumTypes[0].EnumDescriptor
 }
 
+func (ForeignEnum) Type() protoreflect.EnumType {
+	return &file_test_test_proto_enumTypes[0]
+}
+
 func (x ForeignEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -100,6 +104,10 @@
 	return file_test_test_proto_enumTypes[1].EnumDescriptor
 }
 
+func (TestReservedEnumFields) Type() protoreflect.EnumType {
+	return &file_test_test_proto_enumTypes[1]
+}
+
 func (x TestReservedEnumFields) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -156,6 +164,10 @@
 	return file_test_test_proto_enumTypes[2].EnumDescriptor
 }
 
+func (TestAllTypes_NestedEnum) Type() protoreflect.EnumType {
+	return &file_test_test_proto_enumTypes[2]
+}
+
 func (x TestAllTypes_NestedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -202,6 +214,10 @@
 	return file_test_test_proto_enumTypes[3].EnumDescriptor
 }
 
+func (TestDeprecatedMessage_DeprecatedEnum) Type() protoreflect.EnumType {
+	return &file_test_test_proto_enumTypes[3]
+}
+
 func (x TestDeprecatedMessage_DeprecatedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
diff --git a/internal/testprotos/test/test_import.pb.go b/internal/testprotos/test/test_import.pb.go
index 28c6dcc..0499923 100644
--- a/internal/testprotos/test/test_import.pb.go
+++ b/internal/testprotos/test/test_import.pb.go
@@ -45,6 +45,10 @@
 	return file_test_test_import_proto_enumTypes[0].EnumDescriptor
 }
 
+func (ImportEnum) Type() protoreflect.EnumType {
+	return &file_test_test_import_proto_enumTypes[0]
+}
+
 func (x ImportEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
diff --git a/internal/testprotos/test3/test.pb.go b/internal/testprotos/test3/test.pb.go
index 32d9131..506ccf7 100644
--- a/internal/testprotos/test3/test.pb.go
+++ b/internal/testprotos/test3/test.pb.go
@@ -54,6 +54,10 @@
 	return file_test3_test_proto_enumTypes[0].EnumDescriptor
 }
 
+func (ForeignEnum) Type() protoreflect.EnumType {
+	return &file_test3_test_proto_enumTypes[0]
+}
+
 func (x ForeignEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -100,6 +104,10 @@
 	return file_test3_test_proto_enumTypes[1].EnumDescriptor
 }
 
+func (TestAllTypes_NestedEnum) Type() protoreflect.EnumType {
+	return &file_test3_test_proto_enumTypes[1]
+}
+
 func (x TestAllTypes_NestedEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
diff --git a/internal/testprotos/test3/test_import.pb.go b/internal/testprotos/test3/test_import.pb.go
index 4393958..b47c98f 100644
--- a/internal/testprotos/test3/test_import.pb.go
+++ b/internal/testprotos/test3/test_import.pb.go
@@ -45,6 +45,10 @@
 	return file_test3_test_import_proto_enumTypes[0].EnumDescriptor
 }
 
+func (ImportEnum) Type() protoreflect.EnumType {
+	return &file_test3_test_import_proto_enumTypes[0]
+}
+
 func (x ImportEnum) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
diff --git a/reflect/protoreflect/value.go b/reflect/protoreflect/value.go
index e42549f..3d78260 100644
--- a/reflect/protoreflect/value.go
+++ b/reflect/protoreflect/value.go
@@ -11,8 +11,15 @@
 // Enum does not provide a mutable API since enums are commonly backed by
 // Go constants, which are not addressable.
 type Enum interface {
+	// Descriptor returns enum descriptor, which contains only the protobuf
+	// type information for the enum.
 	Descriptor() EnumDescriptor
 
+	// Type returns the enum type, which encapsulates both Go and protobuf
+	// type information. If the Go type information is not needed,
+	// it is recommended that the enum descriptor be used instead.
+	Type() EnumType
+
 	// Number returns the enum value as an integer.
 	Number() EnumNumber
 }
@@ -31,8 +38,15 @@
 // See Value for the Go types associated with a FieldDescriptor.
 // Providing a Value that is invalid or of an incorrect type panics.
 type Message interface {
+	// Descriptor returns message descriptor, which contains only the protobuf
+	// type information for the message.
 	Descriptor() MessageDescriptor
 
+	// Type returns the message type, which encapsulates both Go and protobuf
+	// type information. If the Go type information is not needed,
+	// it is recommended that the message descriptor be used instead.
+	Type() MessageType
+
 	// New returns a newly allocated and mutable empty message.
 	New() Message
 
diff --git a/reflect/protoregistry/registry.go b/reflect/protoregistry/registry.go
index 1337d26..f5437b2 100644
--- a/reflect/protoregistry/registry.go
+++ b/reflect/protoregistry/registry.go
@@ -406,11 +406,11 @@
 			var name protoreflect.FullName
 			switch t := typ.(type) {
 			case protoreflect.EnumType:
-				name = t.Descriptor().FullName()
+				name = t.FullName()
 			case protoreflect.MessageType:
-				name = t.Descriptor().FullName()
+				name = t.FullName()
 			case protoreflect.ExtensionType:
-				name = t.Descriptor().FullName()
+				name = t.FullName()
 			default:
 				panic(fmt.Sprintf("invalid type: %T", t))
 			}
@@ -423,8 +423,8 @@
 
 			// Check for conflicts in extensionsByMessage.
 			if xt, _ := typ.(protoreflect.ExtensionType); xt != nil {
-				field := xt.Descriptor().Number()
-				message := xt.Descriptor().ContainingMessage().FullName()
+				field := xt.Number()
+				message := xt.ContainingMessage().FullName()
 				if r.extensionsByMessage[message][field] != nil {
 					if firstErr == nil {
 						firstErr = errors.New("extension %v is already registered on message %v", name, message)
diff --git a/reflect/protoregistry/registry_test.go b/reflect/protoregistry/registry_test.go
index d59910d..3d87651 100644
--- a/reflect/protoregistry/registry_test.go
+++ b/reflect/protoregistry/registry_test.go
@@ -536,11 +536,11 @@
 	fullName := func(t preg.Type) pref.FullName {
 		switch t := t.(type) {
 		case pref.EnumType:
-			return t.Descriptor().FullName()
+			return t.FullName()
 		case pref.MessageType:
-			return t.Descriptor().FullName()
+			return t.FullName()
 		case pref.ExtensionType:
-			return t.Descriptor().FullName()
+			return t.FullName()
 		default:
 			panic("invalid type")
 		}
diff --git a/reflect/protoregistry/testprotos/test.pb.go b/reflect/protoregistry/testprotos/test.pb.go
index d5c7439..705af3a 100644
--- a/reflect/protoregistry/testprotos/test.pb.go
+++ b/reflect/protoregistry/testprotos/test.pb.go
@@ -46,6 +46,10 @@
 	return file_test_proto_enumTypes[0].EnumDescriptor
 }
 
+func (Enum1) Type() protoreflect.EnumType {
+	return &file_test_proto_enumTypes[0]
+}
+
 func (x Enum1) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -93,6 +97,10 @@
 	return file_test_proto_enumTypes[1].EnumDescriptor
 }
 
+func (Enum2) Type() protoreflect.EnumType {
+	return &file_test_proto_enumTypes[1]
+}
+
 func (x Enum2) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -140,6 +148,10 @@
 	return file_test_proto_enumTypes[2].EnumDescriptor
 }
 
+func (Enum3) Type() protoreflect.EnumType {
+	return &file_test_proto_enumTypes[2]
+}
+
 func (x Enum3) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
diff --git a/types/descriptorpb/descriptor.pb.go b/types/descriptorpb/descriptor.pb.go
index baf3784..c9abdcb 100644
--- a/types/descriptorpb/descriptor.pb.go
+++ b/types/descriptorpb/descriptor.pb.go
@@ -108,6 +108,10 @@
 	return file_google_protobuf_descriptor_proto_enumTypes[0].EnumDescriptor
 }
 
+func (FieldDescriptorProto_Type) Type() protoreflect.EnumType {
+	return &file_google_protobuf_descriptor_proto_enumTypes[0]
+}
+
 func (x FieldDescriptorProto_Type) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -162,6 +166,10 @@
 	return file_google_protobuf_descriptor_proto_enumTypes[1].EnumDescriptor
 }
 
+func (FieldDescriptorProto_Label) Type() protoreflect.EnumType {
+	return &file_google_protobuf_descriptor_proto_enumTypes[1]
+}
+
 func (x FieldDescriptorProto_Label) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -217,6 +225,10 @@
 	return file_google_protobuf_descriptor_proto_enumTypes[2].EnumDescriptor
 }
 
+func (FileOptions_OptimizeMode) Type() protoreflect.EnumType {
+	return &file_google_protobuf_descriptor_proto_enumTypes[2]
+}
+
 func (x FileOptions_OptimizeMode) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -271,6 +283,10 @@
 	return file_google_protobuf_descriptor_proto_enumTypes[3].EnumDescriptor
 }
 
+func (FieldOptions_CType) Type() protoreflect.EnumType {
+	return &file_google_protobuf_descriptor_proto_enumTypes[3]
+}
+
 func (x FieldOptions_CType) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -327,6 +343,10 @@
 	return file_google_protobuf_descriptor_proto_enumTypes[4].EnumDescriptor
 }
 
+func (FieldOptions_JSType) Type() protoreflect.EnumType {
+	return &file_google_protobuf_descriptor_proto_enumTypes[4]
+}
+
 func (x FieldOptions_JSType) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -383,6 +403,10 @@
 	return file_google_protobuf_descriptor_proto_enumTypes[5].EnumDescriptor
 }
 
+func (MethodOptions_IdempotencyLevel) Type() protoreflect.EnumType {
+	return &file_google_protobuf_descriptor_proto_enumTypes[5]
+}
+
 func (x MethodOptions_IdempotencyLevel) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
diff --git a/types/dynamicpb/dynamic.go b/types/dynamicpb/dynamic.go
index cae3399..5f1b73b 100644
--- a/types/dynamicpb/dynamic.go
+++ b/types/dynamicpb/dynamic.go
@@ -10,6 +10,7 @@
 
 	"google.golang.org/protobuf/internal/errors"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
+	"google.golang.org/protobuf/reflect/prototype"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 )
 
@@ -29,7 +30,7 @@
 //
 // Operations which modify a Message are not safe for concurrent use.
 type Message struct {
-	desc    pref.MessageDescriptor
+	typ     prototype.Message
 	known   map[pref.FieldNumber]pref.Value
 	ext     map[pref.FieldNumber]pref.FieldDescriptor
 	unknown pref.RawFields
@@ -38,7 +39,10 @@
 // New creates a new message with the provided descriptor.
 func New(desc pref.MessageDescriptor) *Message {
 	return &Message{
-		desc:  desc,
+		typ: prototype.Message{
+			MessageDescriptor: desc,
+			NewMessage:        func() pref.Message { return New(desc) },
+		},
 		known: make(map[pref.FieldNumber]pref.Value),
 		ext:   make(map[pref.FieldNumber]pref.FieldDescriptor),
 	}
@@ -56,13 +60,18 @@
 
 // Descriptor returns the message descriptor.
 func (m *Message) Descriptor() pref.MessageDescriptor {
-	return m.desc
+	return m.typ.Descriptor()
+}
+
+// Type returns the message type.
+func (m *Message) Type() pref.MessageType {
+	return &m.typ
 }
 
 // New returns a newly allocated empty message with the same descriptor.
 // See protoreflect.Message for details.
 func (m *Message) New() pref.Message {
-	return New(m.desc)
+	return m.Type().New()
 }
 
 // Interface returns the message.
@@ -77,7 +86,7 @@
 	for num, v := range m.known {
 		fd := m.ext[num]
 		if fd == nil {
-			fd = m.desc.Fields().ByNumber(num)
+			fd = m.Descriptor().Fields().ByNumber(num)
 			if !isSet(fd, v) {
 				continue
 			}
@@ -237,16 +246,16 @@
 }
 
 func (m *Message) checkField(fd pref.FieldDescriptor) {
-	if fd.IsExtension() && fd.ContainingMessage().FullName() == m.desc.FullName() {
+	if fd.IsExtension() && fd.ContainingMessage().FullName() == m.Descriptor().FullName() {
 		if _, ok := fd.(pref.ExtensionType); !ok {
 			panic(errors.New("%v: extension field descriptor does not implement ExtensionType", fd.FullName()))
 		}
 		return
 	}
-	if fd.Parent() == m.desc {
+	if fd.Parent() == m.Descriptor() {
 		return
 	}
-	fields := m.desc.Fields()
+	fields := m.Descriptor().Fields()
 	index := fd.Index()
 	if index >= fields.Len() || fields.Get(index) != fd {
 		panic(errors.New("%v: field descriptor does not belong to this message", fd.FullName()))
diff --git a/types/known/structpb/struct.pb.go b/types/known/structpb/struct.pb.go
index c1ea147..dd97bdd 100644
--- a/types/known/structpb/struct.pb.go
+++ b/types/known/structpb/struct.pb.go
@@ -50,6 +50,10 @@
 	return file_google_protobuf_struct_proto_enumTypes[0].EnumDescriptor
 }
 
+func (NullValue) Type() protoreflect.EnumType {
+	return &file_google_protobuf_struct_proto_enumTypes[0]
+}
+
 func (x NullValue) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
diff --git a/types/known/typepb/type.pb.go b/types/known/typepb/type.pb.go
index 4153fb2..91f0fcd 100644
--- a/types/known/typepb/type.pb.go
+++ b/types/known/typepb/type.pb.go
@@ -53,6 +53,10 @@
 	return file_google_protobuf_type_proto_enumTypes[0].EnumDescriptor
 }
 
+func (Syntax) Type() protoreflect.EnumType {
+	return &file_google_protobuf_type_proto_enumTypes[0]
+}
+
 func (x Syntax) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -164,6 +168,10 @@
 	return file_google_protobuf_type_proto_enumTypes[1].EnumDescriptor
 }
 
+func (Field_Kind) Type() protoreflect.EnumType {
+	return &file_google_protobuf_type_proto_enumTypes[1]
+}
+
 func (x Field_Kind) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }
@@ -215,6 +223,10 @@
 	return file_google_protobuf_type_proto_enumTypes[2].EnumDescriptor
 }
 
+func (Field_Cardinality) Type() protoreflect.EnumType {
+	return &file_google_protobuf_type_proto_enumTypes[2]
+}
+
 func (x Field_Cardinality) Number() protoreflect.EnumNumber {
 	return protoreflect.EnumNumber(x)
 }