diff --git a/cmd/protoc-gen-go-grpc/internal_gengogrpc/grpc.go b/cmd/protoc-gen-go-grpc/internal_gengogrpc/grpc.go
index c307633..3610c89 100644
--- a/cmd/protoc-gen-go-grpc/internal_gengogrpc/grpc.go
+++ b/cmd/protoc-gen-go-grpc/internal_gengogrpc/grpc.go
@@ -181,20 +181,20 @@
 func clientSignature(g *protogen.GeneratedFile, method *protogen.Method) string {
 	s := method.GoName + "(ctx " + g.QualifiedGoIdent(contextPackage.Ident("Context"))
 	if !method.Desc.IsStreamingClient() {
-		s += ", in *" + g.QualifiedGoIdent(method.InputType.GoIdent)
+		s += ", in *" + g.QualifiedGoIdent(method.Input.GoIdent)
 	}
 	s += ", opts ..." + g.QualifiedGoIdent(grpcPackage.Ident("CallOption")) + ") ("
 	if !method.Desc.IsStreamingClient() && !method.Desc.IsStreamingServer() {
-		s += "*" + g.QualifiedGoIdent(method.OutputType.GoIdent)
+		s += "*" + g.QualifiedGoIdent(method.Output.GoIdent)
 	} else {
-		s += method.ParentService.GoName + "_" + method.GoName + "Client"
+		s += method.Parent.GoName + "_" + method.GoName + "Client"
 	}
 	s += ", error)"
 	return s
 }
 
 func genClientMethod(gen *protogen.Plugin, file *protogen.File, g *protogen.GeneratedFile, method *protogen.Method, index int) {
-	service := method.ParentService
+	service := method.Parent
 	sname := fmt.Sprintf("/%s/%s", service.Desc.FullName(), method.Desc.Name())
 
 	if method.Desc.Options().(*descriptorpb.MethodOptions).GetDeprecated() {
@@ -202,7 +202,7 @@
 	}
 	g.P("func (c *", unexport(service.GoName), "Client) ", clientSignature(g, method), "{")
 	if !method.Desc.IsStreamingServer() && !method.Desc.IsStreamingClient() {
-		g.P("out := new(", method.OutputType.GoIdent, ")")
+		g.P("out := new(", method.Output.GoIdent, ")")
 		g.P(`err := c.cc.Invoke(ctx, "`, sname, `", in, out, opts...)`)
 		g.P("if err != nil { return nil, err }")
 		g.P("return out, nil")
@@ -230,13 +230,13 @@
 	// Stream auxiliary types and methods.
 	g.P("type ", service.GoName, "_", method.GoName, "Client interface {")
 	if genSend {
-		g.P("Send(*", method.InputType.GoIdent, ") error")
+		g.P("Send(*", method.Input.GoIdent, ") error")
 	}
 	if genRecv {
-		g.P("Recv() (*", method.OutputType.GoIdent, ", error)")
+		g.P("Recv() (*", method.Output.GoIdent, ", error)")
 	}
 	if genCloseAndRecv {
-		g.P("CloseAndRecv() (*", method.OutputType.GoIdent, ", error)")
+		g.P("CloseAndRecv() (*", method.Output.GoIdent, ", error)")
 	}
 	g.P(grpcPackage.Ident("ClientStream"))
 	g.P("}")
@@ -248,23 +248,23 @@
 	g.P()
 
 	if genSend {
-		g.P("func (x *", streamType, ") Send(m *", method.InputType.GoIdent, ") error {")
+		g.P("func (x *", streamType, ") Send(m *", method.Input.GoIdent, ") error {")
 		g.P("return x.ClientStream.SendMsg(m)")
 		g.P("}")
 		g.P()
 	}
 	if genRecv {
-		g.P("func (x *", streamType, ") Recv() (*", method.OutputType.GoIdent, ", error) {")
-		g.P("m := new(", method.OutputType.GoIdent, ")")
+		g.P("func (x *", streamType, ") Recv() (*", method.Output.GoIdent, ", error) {")
+		g.P("m := new(", method.Output.GoIdent, ")")
 		g.P("if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err }")
 		g.P("return m, nil")
 		g.P("}")
 		g.P()
 	}
 	if genCloseAndRecv {
-		g.P("func (x *", streamType, ") CloseAndRecv() (*", method.OutputType.GoIdent, ", error) {")
+		g.P("func (x *", streamType, ") CloseAndRecv() (*", method.Output.GoIdent, ", error) {")
 		g.P("if err := x.ClientStream.CloseSend(); err != nil { return nil, err }")
-		g.P("m := new(", method.OutputType.GoIdent, ")")
+		g.P("m := new(", method.Output.GoIdent, ")")
 		g.P("if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err }")
 		g.P("return m, nil")
 		g.P("}")
@@ -277,24 +277,24 @@
 	ret := "error"
 	if !method.Desc.IsStreamingClient() && !method.Desc.IsStreamingServer() {
 		reqArgs = append(reqArgs, g.QualifiedGoIdent(contextPackage.Ident("Context")))
-		ret = "(*" + g.QualifiedGoIdent(method.OutputType.GoIdent) + ", error)"
+		ret = "(*" + g.QualifiedGoIdent(method.Output.GoIdent) + ", error)"
 	}
 	if !method.Desc.IsStreamingClient() {
-		reqArgs = append(reqArgs, "*"+g.QualifiedGoIdent(method.InputType.GoIdent))
+		reqArgs = append(reqArgs, "*"+g.QualifiedGoIdent(method.Input.GoIdent))
 	}
 	if method.Desc.IsStreamingClient() || method.Desc.IsStreamingServer() {
-		reqArgs = append(reqArgs, method.ParentService.GoName+"_"+method.GoName+"Server")
+		reqArgs = append(reqArgs, method.Parent.GoName+"_"+method.GoName+"Server")
 	}
 	return method.GoName + "(" + strings.Join(reqArgs, ", ") + ") " + ret
 }
 
 func genServerMethod(gen *protogen.Plugin, file *protogen.File, g *protogen.GeneratedFile, method *protogen.Method) string {
-	service := method.ParentService
+	service := method.Parent
 	hname := fmt.Sprintf("_%s_%s_Handler", service.GoName, method.GoName)
 
 	if !method.Desc.IsStreamingClient() && !method.Desc.IsStreamingServer() {
 		g.P("func ", hname, "(srv interface{}, ctx ", contextPackage.Ident("Context"), ", dec func(interface{}) error, interceptor ", grpcPackage.Ident("UnaryServerInterceptor"), ") (interface{}, error) {")
-		g.P("in := new(", method.InputType.GoIdent, ")")
+		g.P("in := new(", method.Input.GoIdent, ")")
 		g.P("if err := dec(in); err != nil { return nil, err }")
 		g.P("if interceptor == nil { return srv.(", service.GoName, "Server).", method.GoName, "(ctx, in) }")
 		g.P("info := &", grpcPackage.Ident("UnaryServerInfo"), "{")
@@ -302,7 +302,7 @@
 		g.P("FullMethod: ", strconv.Quote(fmt.Sprintf("/%s/%s", service.Desc.FullName(), method.GoName)), ",")
 		g.P("}")
 		g.P("handler := func(ctx ", contextPackage.Ident("Context"), ", req interface{}) (interface{}, error) {")
-		g.P("return srv.(", service.GoName, "Server).", method.GoName, "(ctx, req.(*", method.InputType.GoIdent, "))")
+		g.P("return srv.(", service.GoName, "Server).", method.GoName, "(ctx, req.(*", method.Input.GoIdent, "))")
 		g.P("}")
 		g.P("return interceptor(ctx, in, info, handler)")
 		g.P("}")
@@ -312,7 +312,7 @@
 	streamType := unexport(service.GoName) + method.GoName + "Server"
 	g.P("func ", hname, "(srv interface{}, stream ", grpcPackage.Ident("ServerStream"), ") error {")
 	if !method.Desc.IsStreamingClient() {
-		g.P("m := new(", method.InputType.GoIdent, ")")
+		g.P("m := new(", method.Input.GoIdent, ")")
 		g.P("if err := stream.RecvMsg(m); err != nil { return err }")
 		g.P("return srv.(", service.GoName, "Server).", method.GoName, "(m, &", streamType, "{stream})")
 	} else {
@@ -328,13 +328,13 @@
 	// Stream auxiliary types and methods.
 	g.P("type ", service.GoName, "_", method.GoName, "Server interface {")
 	if genSend {
-		g.P("Send(*", method.OutputType.GoIdent, ") error")
+		g.P("Send(*", method.Output.GoIdent, ") error")
 	}
 	if genSendAndClose {
-		g.P("SendAndClose(*", method.OutputType.GoIdent, ") error")
+		g.P("SendAndClose(*", method.Output.GoIdent, ") error")
 	}
 	if genRecv {
-		g.P("Recv() (*", method.InputType.GoIdent, ", error)")
+		g.P("Recv() (*", method.Input.GoIdent, ", error)")
 	}
 	g.P(grpcPackage.Ident("ServerStream"))
 	g.P("}")
@@ -346,20 +346,20 @@
 	g.P()
 
 	if genSend {
-		g.P("func (x *", streamType, ") Send(m *", method.OutputType.GoIdent, ") error {")
+		g.P("func (x *", streamType, ") Send(m *", method.Output.GoIdent, ") error {")
 		g.P("return x.ServerStream.SendMsg(m)")
 		g.P("}")
 		g.P()
 	}
 	if genSendAndClose {
-		g.P("func (x *", streamType, ") SendAndClose(m *", method.OutputType.GoIdent, ") error {")
+		g.P("func (x *", streamType, ") SendAndClose(m *", method.Output.GoIdent, ") error {")
 		g.P("return x.ServerStream.SendMsg(m)")
 		g.P("}")
 		g.P()
 	}
 	if genRecv {
-		g.P("func (x *", streamType, ") Recv() (*", method.InputType.GoIdent, ", error) {")
-		g.P("m := new(", method.InputType.GoIdent, ")")
+		g.P("func (x *", streamType, ") Recv() (*", method.Input.GoIdent, ", error) {")
+		g.P("m := new(", method.Input.GoIdent, ")")
 		g.P("if err := x.ServerStream.RecvMsg(m); err != nil { return nil, err }")
 		g.P("return m, nil")
 		g.P("}")
diff --git a/cmd/protoc-gen-go/internal_gengo/main.go b/cmd/protoc-gen-go/internal_gengo/main.go
index 0697ffd..6453f17 100644
--- a/cmd/protoc-gen-go/internal_gengo/main.go
+++ b/cmd/protoc-gen-go/internal_gengo/main.go
@@ -350,13 +350,13 @@
 	g.Annotate(message.GoIdent.GoName, message.Location)
 	g.P("type ", message.GoIdent, " struct {")
 	for _, field := range message.Fields {
-		if field.OneofType != nil {
+		if field.Oneof != nil {
 			// It would be a bit simpler to iterate over the oneofs below,
 			// but generating the field here keeps the contents of the Go
 			// struct in the same order as the contents of the source
 			// .proto file.
-			if field == field.OneofType.Fields[0] {
-				genOneofField(gen, g, f, message, field.OneofType)
+			if field == field.Oneof.Fields[0] {
+				genOneofField(gen, g, f, message, field.Oneof)
 			}
 			continue
 		}
@@ -370,8 +370,8 @@
 			fmt.Sprintf("json:%q", fieldJSONTag(field)),
 		}
 		if field.Desc.IsMap() {
-			key := field.MessageType.Fields[0]
-			val := field.MessageType.Fields[1]
+			key := field.Message.Fields[0]
+			val := field.Message.Fields[1]
 			tags = append(tags,
 				fmt.Sprintf("protobuf_key:%q", fieldProtobufTag(key)),
 				fmt.Sprintf("protobuf_val:%q", fieldProtobufTag(val)),
@@ -459,9 +459,9 @@
 			g.P("var ", defVarName, " []byte = []byte(", strconv.Quote(string(def.Bytes())), ")")
 		case protoreflect.EnumKind:
 			evalueDesc := field.Desc.DefaultEnumValue()
-			enum := field.EnumType
+			enum := field.Enum
 			evalue := enum.Values[evalueDesc.Index()]
-			g.P("const ", defVarName, " ", field.EnumType.GoIdent, " = ", evalue.GoIdent)
+			g.P("const ", defVarName, " ", field.Enum.GoIdent, " = ", evalue.GoIdent)
 		case protoreflect.FloatKind, protoreflect.DoubleKind:
 			// Floating point numbers need extra handling for -Inf/Inf/NaN.
 			f := field.Desc.Default().Float()
@@ -498,7 +498,7 @@
 	// Getter methods.
 	for _, field := range message.Fields {
 		if isFirstOneofField(field) {
-			genOneofGetter(gen, g, f, message, field.OneofType)
+			genOneofGetter(gen, g, f, message, field.Oneof)
 		}
 		goType, pointer := fieldGoType(g, field)
 		defaultValue := fieldDefaultValue(g, message, field)
@@ -507,8 +507,8 @@
 		}
 		g.Annotate(message.GoIdent.GoName+".Get"+field.GoName, field.Location)
 		g.P("func (x *", message.GoIdent, ") Get", field.GoName, "() ", goType, " {")
-		if field.OneofType != nil {
-			g.P("if x, ok := x.Get", field.OneofType.GoName, "().(*", fieldOneofType(field), "); ok {")
+		if field.Oneof != nil {
+			g.P("if x, ok := x.Get", field.Oneof.GoName, "().(*", fieldOneofType(field), "); ok {")
 			g.P("return x.", field.GoName)
 			g.P("}")
 		} else {
@@ -549,7 +549,7 @@
 	case protoreflect.BoolKind:
 		goType = "bool"
 	case protoreflect.EnumKind:
-		goType = g.QualifiedGoIdent(field.EnumType.GoIdent)
+		goType = g.QualifiedGoIdent(field.Enum.GoIdent)
 	case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind:
 		goType = "int32"
 	case protoreflect.Uint32Kind, protoreflect.Fixed32Kind:
@@ -569,11 +569,11 @@
 		pointer = false
 	case protoreflect.MessageKind, protoreflect.GroupKind:
 		if field.Desc.IsMap() {
-			keyType, _ := fieldGoType(g, field.MessageType.Fields[0])
-			valType, _ := fieldGoType(g, field.MessageType.Fields[1])
+			keyType, _ := fieldGoType(g, field.Message.Fields[0])
+			valType, _ := fieldGoType(g, field.Message.Fields[1])
 			return fmt.Sprintf("map[%v]%v", keyType, valType), false
 		}
-		goType = "*" + g.QualifiedGoIdent(field.MessageType.GoIdent)
+		goType = "*" + g.QualifiedGoIdent(field.Message.GoIdent)
 		pointer = false
 	}
 	if field.Desc.Cardinality() == protoreflect.Repeated {
@@ -581,7 +581,7 @@
 		pointer = false
 	}
 	// Extension fields always have pointer type, even when defined in a proto3 file.
-	if field.Desc.Syntax() == protoreflect.Proto3 && field.Desc.ExtendedType() == nil {
+	if field.Desc.Syntax() == protoreflect.Proto3 && field.Desc.Extendee() == nil {
 		pointer = false
 	}
 	return goType, pointer
@@ -590,7 +590,7 @@
 func fieldProtobufTag(field *protogen.Field) string {
 	var enumName string
 	if field.Desc.Kind() == protoreflect.EnumKind {
-		enumName = enumLegacyName(field.EnumType)
+		enumName = enumLegacyName(field.Enum)
 	}
 	return tag.Marshal(field.Desc, enumName)
 }
@@ -614,7 +614,7 @@
 	case protoreflect.MessageKind, protoreflect.GroupKind, protoreflect.BytesKind:
 		return "nil"
 	case protoreflect.EnumKind:
-		return g.QualifiedGoIdent(field.EnumType.Values[0].GoIdent)
+		return g.QualifiedGoIdent(field.Enum.Values[0].GoIdent)
 	default:
 		return "0"
 	}
@@ -645,7 +645,7 @@
 		}
 
 		g.P("{")
-		g.P("ExtendedType: (*", extension.ExtendedType.GoIdent, ")(nil),")
+		g.P("ExtendedType: (*", extension.Extendee.GoIdent, ")(nil),")
 		goType, pointer := fieldGoType(g, extension)
 		if pointer {
 			goType = "*" + goType
@@ -662,13 +662,13 @@
 	g.P("var (")
 	for i, extension := range f.allExtensions {
 		ed := extension.Desc
-		targetName := string(ed.ExtendedType().FullName())
+		targetName := string(ed.Extendee().FullName())
 		typeName := ed.Kind().String()
 		switch ed.Kind() {
 		case protoreflect.EnumKind:
-			typeName = string(ed.EnumType().FullName())
+			typeName = string(ed.Enum().FullName())
 		case protoreflect.MessageKind, protoreflect.GroupKind:
-			typeName = string(ed.MessageType().FullName())
+			typeName = string(ed.Message().FullName())
 		}
 		fieldName := string(ed.Name())
 		g.P("// extend ", targetName, " { ", ed.Cardinality().String(), " ", typeName, " ", fieldName, " = ", ed.Number(), "; }")
@@ -681,11 +681,11 @@
 // isExtensionMessageSetELement returns the adjusted name of an extension
 // which extends proto2.bridge.MessageSet.
 func isExtensionMessageSetElement(extension *protogen.Extension) (name protoreflect.FullName, ok bool) {
-	opts := extension.ExtendedType.Desc.Options().(*descriptorpb.MessageOptions)
+	opts := extension.Extendee.Desc.Options().(*descriptorpb.MessageOptions)
 	if !opts.GetMessageSetWireFormat() || extension.Desc.Name() != "message_set_extension" {
 		return "", false
 	}
-	if extension.ParentMessage == nil {
+	if extension.Parent == nil {
 		// This case shouldn't be given special handling at all--we're
 		// only supposed to drop the ".message_set_extension" for
 		// extensions defined within a message (i.e., the extension
@@ -704,8 +704,8 @@
 // extensionVar returns the var holding the ExtensionDesc for an extension.
 func extensionVar(f *protogen.File, extension *protogen.Extension) protogen.GoIdent {
 	name := "E_"
-	if extension.ParentMessage != nil {
-		name += extension.ParentMessage.GoIdent.GoName + "_"
+	if extension.Parent != nil {
+		name += extension.Parent.GoIdent.GoName + "_"
 	}
 	name += extension.GoName
 	return f.GoImportPath.Ident(name)
@@ -820,7 +820,7 @@
 
 // isFirstOneofField reports whether this is the first field in a oneof.
 func isFirstOneofField(field *protogen.Field) bool {
-	return field.OneofType != nil && field.OneofType.Fields[0] == field
+	return field.Oneof != nil && field.Oneof.Fields[0] == field
 }
 
 // oneofFieldName returns the name of the struct field holding the oneof value.
@@ -834,14 +834,14 @@
 // oneofInterfaceName returns the name of the interface type implemented by
 // the oneof field value types.
 func oneofInterfaceName(oneof *protogen.Oneof) string {
-	return fmt.Sprintf("is%s_%s", oneof.ParentMessage.GoIdent.GoName, oneof.GoName)
+	return fmt.Sprintf("is%s_%s", oneof.Parent.GoIdent.GoName, oneof.GoName)
 }
 
 // fieldOneofType returns the wrapper type used to represent a field in a oneof.
 func fieldOneofType(field *protogen.Field) protogen.GoIdent {
 	ident := protogen.GoIdent{
-		GoImportPath: field.ParentMessage.GoIdent.GoImportPath,
-		GoName:       field.ParentMessage.GoIdent.GoName + "_" + field.GoName,
+		GoImportPath: field.Parent.GoIdent.GoImportPath,
+		GoName:       field.Parent.GoIdent.GoName + "_" + field.GoName,
 	}
 	// Check for collisions with nested messages or enums.
 	//
@@ -853,13 +853,13 @@
 	// field and type names in mostly unpredictable ways.
 Loop:
 	for {
-		for _, message := range field.ParentMessage.Messages {
+		for _, message := range field.Parent.Messages {
 			if message.GoIdent == ident {
 				ident.GoName += "_"
 				continue Loop
 			}
 		}
-		for _, enum := range field.ParentMessage.Enums {
+		for _, enum := range field.Parent.Enums {
 			if enum.GoIdent == ident {
 				ident.GoName += "_"
 				continue Loop
diff --git a/cmd/protoc-gen-go/internal_gengo/reflect.go b/cmd/protoc-gen-go/internal_gengo/reflect.go
index fb33ea2..ec45e16 100644
--- a/cmd/protoc-gen-go/internal_gengo/reflect.go
+++ b/cmd/protoc-gen-go/internal_gengo/reflect.go
@@ -82,7 +82,7 @@
 	}
 	for _, extension := range f.allExtensions {
 		source := string(extension.Desc.FullName())
-		genMessage(extension.ExtendedType, source+":extendee")
+		genMessage(extension.Extendee, source+":extendee")
 	}
 	for _, message := range f.allMessages {
 		for _, field := range message.Fields {
@@ -90,20 +90,20 @@
 				continue
 			}
 			source := string(field.Desc.FullName())
-			genEnum(field.EnumType, source+":type_name")
-			genMessage(field.MessageType, source+":type_name")
+			genEnum(field.Enum, source+":type_name")
+			genMessage(field.Message, source+":type_name")
 		}
 	}
 	for _, extension := range f.allExtensions {
 		source := string(extension.Desc.FullName())
-		genEnum(extension.EnumType, source+":type_name")
-		genMessage(extension.MessageType, source+":type_name")
+		genEnum(extension.Enum, source+":type_name")
+		genMessage(extension.Message, source+":type_name")
 	}
 	for _, service := range f.Services {
 		for _, method := range service.Methods {
 			source := string(method.Desc.FullName())
-			genMessage(method.InputType, source+":input_type")
-			genMessage(method.OutputType, source+":output_type")
+			genMessage(method.Input, source+":input_type")
+			genMessage(method.Output, source+":output_type")
 		}
 	}
 	if len(depIdxs) > math.MaxInt32 {
diff --git a/encoding/bench_test.go b/encoding/bench_test.go
index ca866c0..32c81d3 100644
--- a/encoding/bench_test.go
+++ b/encoding/bench_test.go
@@ -125,7 +125,7 @@
 }
 
 func setMap(mmap pref.Map, fd pref.FieldDescriptor, level int) {
-	fields := fd.MessageType().Fields()
+	fields := fd.Message().Fields()
 	keyDesc := fields.ByNumber(1)
 	valDesc := fields.ByNumber(2)
 
diff --git a/encoding/jsonpb/decode.go b/encoding/jsonpb/decode.go
index 80700df..4b46ffc 100644
--- a/encoding/jsonpb/decode.go
+++ b/encoding/jsonpb/decode.go
@@ -242,7 +242,7 @@
 			}
 		} else {
 			// If field is a oneof, check if it has already been set.
-			if od := fd.OneofType(); od != nil {
+			if od := fd.Oneof(); od != nil {
 				idx := uint64(od.Index())
 				if seenOneofs.Has(idx) {
 					return errors.New("%v: oneof is already set", od.FullName())
@@ -276,12 +276,12 @@
 }
 
 func isKnownValue(fd pref.FieldDescriptor) bool {
-	md := fd.MessageType()
+	md := fd.Message()
 	return md != nil && md.FullName() == "google.protobuf.Value"
 }
 
 func isNullValue(fd pref.FieldDescriptor) bool {
-	ed := fd.EnumType()
+	ed := fd.Enum()
 	return ed != nil && ed.FullName() == "google.protobuf.NullValue"
 }
 
@@ -506,7 +506,7 @@
 	case json.String:
 		// Lookup EnumNumber based on name.
 		s := jval.String()
-		if enumVal := fd.EnumType().Values().ByName(pref.Name(s)); enumVal != nil {
+		if enumVal := fd.Enum().Values().ByName(pref.Name(s)); enumVal != nil {
 			return pref.ValueOf(enumVal.Number()), nil
 		}
 		return pref.Value{}, newError("invalid enum value %q", jval)
@@ -602,7 +602,7 @@
 		return unexpectedJSONError{jval}
 	}
 
-	fields := fd.MessageType().Fields()
+	fields := fd.Message().Fields()
 	keyDesc := fields.ByNumber(1)
 	valDesc := fields.ByNumber(2)
 
diff --git a/encoding/jsonpb/encode.go b/encoding/jsonpb/encode.go
index 2d2d626..9375091 100644
--- a/encoding/jsonpb/encode.go
+++ b/encoding/jsonpb/encode.go
@@ -178,19 +178,16 @@
 		}
 
 	case pref.EnumKind:
-		enumType := fd.EnumType()
-		num := val.Enum()
-
-		if enumType.FullName() == "google.protobuf.NullValue" {
+		if fd.Enum().FullName() == "google.protobuf.NullValue" {
 			o.encoder.WriteNull()
-		} else if desc := enumType.Values().ByNumber(num); desc != nil {
+		} else if desc := fd.Enum().Values().ByNumber(val.Enum()); desc != nil {
 			err := o.encoder.WriteString(string(desc.Name()))
 			if !nerr.Merge(err) {
 				return err
 			}
 		} else {
 			// Use numeric value if there is no enum value descriptor.
-			o.encoder.WriteInt(int64(num))
+			o.encoder.WriteInt(int64(val.Enum()))
 		}
 
 	case pref.MessageKind, pref.GroupKind:
@@ -229,7 +226,7 @@
 	o.encoder.StartObject()
 	defer o.encoder.EndObject()
 
-	msgFields := fd.MessageType().Fields()
+	msgFields := fd.Message().Fields()
 	keyType := msgFields.ByNumber(1)
 	valType := msgFields.ByNumber(2)
 
@@ -286,7 +283,7 @@
 		name := xt.FullName()
 		// If extended type is a MessageSet, set field name to be the message type name.
 		if isMessageSetExtension(xt) {
-			name = xt.MessageType().FullName()
+			name = xt.Message().FullName()
 		}
 
 		num := xt.Number()
@@ -328,13 +325,13 @@
 	if xt.Name() != "message_set_extension" {
 		return false
 	}
-	mt := xt.MessageType()
-	if mt == nil {
+	md := xt.Message()
+	if md == nil {
 		return false
 	}
-	if xt.FullName().Parent() != mt.FullName() {
+	if xt.FullName().Parent() != md.FullName() {
 		return false
 	}
-	xmt, ok := xt.ExtendedType().(interface{ IsMessageSet() bool })
-	return ok && xmt.IsMessageSet()
+	xmd, ok := xt.Extendee().(interface{ IsMessageSet() bool })
+	return ok && xmd.IsMessageSet()
 }
diff --git a/encoding/textpb/decode.go b/encoding/textpb/decode.go
index 218d95f..863911f 100644
--- a/encoding/textpb/decode.go
+++ b/encoding/textpb/decode.go
@@ -164,7 +164,7 @@
 			}
 		} else {
 			// If field is a oneof, check if it has already been set.
-			if od := fd.OneofType(); od != nil {
+			if od := fd.Oneof(); od != nil {
 				idx := uint64(od.Index())
 				if seenOneofs.Has(idx) {
 					return errors.New("oneof %v is already set", od.FullName())
@@ -313,7 +313,7 @@
 		}
 		if name, ok := input.Name(); ok {
 			// Lookup EnumNumber based on name.
-			if enumVal := fd.EnumType().Values().ByName(name); enumVal != nil {
+			if enumVal := fd.Enum().Values().ByName(name); enumVal != nil {
 				return pref.ValueOf(enumVal.Number()), nil
 			}
 		}
@@ -356,7 +356,7 @@
 // unmarshalMap unmarshals given []text.Value into given protoreflect.Map.
 func (o UnmarshalOptions) unmarshalMap(input []text.Value, fd pref.FieldDescriptor, mmap pref.Map) error {
 	var nerr errors.NonFatal
-	fields := fd.MessageType().Fields()
+	fields := fd.Message().Fields()
 	keyDesc := fields.ByNumber(1)
 	valDesc := fields.ByNumber(2)
 
diff --git a/encoding/textpb/encode.go b/encoding/textpb/encode.go
index c706898..bce34b7 100644
--- a/encoding/textpb/encode.go
+++ b/encoding/textpb/encode.go
@@ -101,7 +101,7 @@
 		name := text.ValueOf(fd.Name())
 		// Use type name for group field name.
 		if fd.Kind() == pref.GroupKind {
-			name = text.ValueOf(fd.MessageType().Name())
+			name = text.ValueOf(fd.Message().Name())
 		}
 		pval := knownFields.Get(num)
 		var err error
@@ -189,7 +189,7 @@
 
 	case pref.EnumKind:
 		num := val.Enum()
-		if desc := fd.EnumType().Values().ByNumber(num); desc != nil {
+		if desc := fd.Enum().Values().ByNumber(num); desc != nil {
 			return text.ValueOf(desc.Name()), nil
 		}
 		// Use numeric value if there is no enum description.
@@ -231,7 +231,7 @@
 	var nerr errors.NonFatal
 	// values is a list of messages.
 	values := make([]text.Value, 0, mmap.Len())
-	msgFields := fd.MessageType().Fields()
+	msgFields := fd.Message().Fields()
 	keyType := msgFields.ByNumber(1)
 	valType := msgFields.ByNumber(2)
 
@@ -274,7 +274,7 @@
 		name := xt.FullName()
 		// If extended type is a MessageSet, set field name to be the message type name.
 		if isMessageSetExtension(xt) {
-			name = xt.MessageType().FullName()
+			name = xt.Message().FullName()
 		}
 
 		num := xt.Number()
@@ -306,15 +306,15 @@
 	if xt.Name() != "message_set_extension" {
 		return false
 	}
-	mt := xt.MessageType()
-	if mt == nil {
+	md := xt.Message()
+	if md == nil {
 		return false
 	}
-	if xt.FullName().Parent() != mt.FullName() {
+	if xt.FullName().Parent() != md.FullName() {
 		return false
 	}
-	xmt, ok := xt.ExtendedType().(interface{ IsMessageSet() bool })
-	return ok && xmt.IsMessageSet()
+	xmd, ok := xt.Extendee().(interface{ IsMessageSet() bool })
+	return ok && xmd.IsMessageSet()
 }
 
 // appendUnknown parses the given []byte and appends field(s) into the given fields slice.
diff --git a/internal/cmd/generate-protos/main.go b/internal/cmd/generate-protos/main.go
index ec358e3..78e3c19 100644
--- a/internal/cmd/generate-protos/main.go
+++ b/internal/cmd/generate-protos/main.go
@@ -234,9 +234,9 @@
 				typeName := fd.Kind().String()
 				switch fd.Kind() {
 				case protoreflect.EnumKind:
-					typeName = string(fd.EnumType().FullName())
+					typeName = string(fd.Enum().FullName())
 				case protoreflect.MessageKind, protoreflect.GroupKind:
-					typeName = string(fd.MessageType().FullName())
+					typeName = string(fd.Message().FullName())
 				}
 				g.P(message.GoIdent.GoName, "_", field.GoName, "=", fd.Number(), "// ", fd.Cardinality(), " ", typeName)
 			}
diff --git a/internal/encoding/pack/pack.go b/internal/encoding/pack/pack.go
index 93dc4ed..6cb9aa2 100644
--- a/internal/encoding/pack/pack.go
+++ b/internal/encoding/pack/pack.go
@@ -325,7 +325,7 @@
 				kind = fieldDesc.Kind()
 				switch kind {
 				case protoreflect.MessageKind, protoreflect.GroupKind:
-					subDesc = fieldDesc.MessageType()
+					subDesc = fieldDesc.Message()
 					if subDesc == nil || subDesc.IsPlaceholder() {
 						kind = 0
 					}
diff --git a/internal/encoding/tag/tag.go b/internal/encoding/tag/tag.go
index 23c07f5..72499c1 100644
--- a/internal/encoding/tag/tag.go
+++ b/internal/encoding/tag/tag.go
@@ -166,7 +166,7 @@
 		// The name of the FieldDescriptor for a group field is
 		// lowercased. To find the original capitalization, we
 		// look in the field's MessageType.
-		name = string(fd.MessageType().Name())
+		name = string(fd.Message().Name())
 	}
 	tag = append(tag, "name="+name)
 	if jsonName := fd.JSONName(); jsonName != "" && jsonName != name {
@@ -175,13 +175,13 @@
 	// The previous implementation does not tag extension fields as proto3,
 	// even when the field is defined in a proto3 file. Match that behavior
 	// for consistency.
-	if fd.Syntax() == pref.Proto3 && fd.ExtendedType() == nil {
+	if fd.Syntax() == pref.Proto3 && fd.Extendee() == nil {
 		tag = append(tag, "proto3")
 	}
 	if fd.Kind() == pref.EnumKind && enumName != "" {
 		tag = append(tag, "enum="+enumName)
 	}
-	if fd.OneofType() != nil {
+	if fd.Oneof() != nil {
 		tag = append(tag, "oneof")
 	}
 	// This must appear last in the tag, since commas in strings aren't escaped.
diff --git a/internal/fileinit/desc.go b/internal/fileinit/desc.go
index 120b7b9..1d1e10a 100644
--- a/internal/fileinit/desc.go
+++ b/internal/fileinit/desc.go
@@ -439,13 +439,19 @@
 func (fd *fieldDesc) HasDefault() bool                           { return fd.defVal.has }
 func (fd *fieldDesc) Default() pref.Value                        { return fd.defVal.get() }
 func (fd *fieldDesc) DefaultEnumValue() pref.EnumValueDescriptor { return fd.defVal.enum }
-func (fd *fieldDesc) OneofType() pref.OneofDescriptor            { return fd.oneofType }
-func (fd *fieldDesc) ExtendedType() pref.MessageDescriptor       { return nil }
-func (fd *fieldDesc) EnumType() pref.EnumDescriptor              { return fd.enumType }
-func (fd *fieldDesc) MessageType() pref.MessageDescriptor        { return fd.messageType }
+func (fd *fieldDesc) Oneof() pref.OneofDescriptor                { return fd.oneofType }
+func (fd *fieldDesc) Extendee() pref.MessageDescriptor           { return nil }
+func (fd *fieldDesc) Enum() pref.EnumDescriptor                  { return fd.enumType }
+func (fd *fieldDesc) Message() pref.MessageDescriptor            { return fd.messageType }
 func (fd *fieldDesc) Format(s fmt.State, r rune)                 { pfmt.FormatDesc(s, r, fd) }
 func (fd *fieldDesc) ProtoType(pref.FieldDescriptor)             {}
 
+// TODO: Remove these methods.
+func (fd *fieldDesc) OneofType() pref.OneofDescriptor      { return fd.Oneof() }
+func (fd *fieldDesc) ExtendedType() pref.MessageDescriptor { return fd.Extendee() }
+func (fd *fieldDesc) EnumType() pref.EnumDescriptor        { return fd.Enum() }
+func (fd *fieldDesc) MessageType() pref.MessageDescriptor  { return fd.Message() }
+
 func (od *oneofDesc) Options() pref.ProtoMessage {
 	return unmarshalOptions(descopts.Oneof, od.options)
 }
@@ -506,10 +512,10 @@
 func (xd *extensionDesc) HasDefault() bool                           { return xd.lazyInit().defVal.has }
 func (xd *extensionDesc) Default() pref.Value                        { return xd.lazyInit().defVal.get() }
 func (xd *extensionDesc) DefaultEnumValue() pref.EnumValueDescriptor { return xd.lazyInit().defVal.enum }
-func (xd *extensionDesc) OneofType() pref.OneofDescriptor            { return nil }
-func (xd *extensionDesc) ExtendedType() pref.MessageDescriptor       { return xd.extendedType }
-func (xd *extensionDesc) EnumType() pref.EnumDescriptor              { return xd.lazyInit().enumType }
-func (xd *extensionDesc) MessageType() pref.MessageDescriptor        { return xd.lazyInit().messageType }
+func (xd *extensionDesc) Oneof() pref.OneofDescriptor                { return nil }
+func (xd *extensionDesc) Extendee() pref.MessageDescriptor           { return xd.extendedType }
+func (xd *extensionDesc) Enum() pref.EnumDescriptor                  { return xd.lazyInit().enumType }
+func (xd *extensionDesc) Message() pref.MessageDescriptor            { return xd.lazyInit().messageType }
 func (xd *extensionDesc) Format(s fmt.State, r rune)                 { pfmt.FormatDesc(s, r, xd) }
 func (xd *extensionDesc) ProtoType(pref.FieldDescriptor)             {}
 func (xd *extensionDesc) ProtoInternal(pragma.DoNotImplement)        {}
@@ -527,6 +533,12 @@
 	return xd.legacyDesc
 }
 
+// TODO: Remove these methods.
+func (xd *extensionDesc) OneofType() pref.OneofDescriptor      { return xd.Oneof() }
+func (xd *extensionDesc) ExtendedType() pref.MessageDescriptor { return xd.Extendee() }
+func (xd *extensionDesc) EnumType() pref.EnumDescriptor        { return xd.Enum() }
+func (xd *extensionDesc) MessageType() pref.MessageDescriptor  { return xd.Message() }
+
 type (
 	serviceDesc struct {
 		baseDesc
@@ -563,14 +575,18 @@
 func (md *methodDesc) Options() pref.ProtoMessage {
 	return unmarshalOptions(descopts.Method, md.options)
 }
-func (md *methodDesc) InputType() pref.MessageDescriptor   { return md.inputType }
-func (md *methodDesc) OutputType() pref.MessageDescriptor  { return md.outputType }
+func (md *methodDesc) Input() pref.MessageDescriptor       { return md.inputType }
+func (md *methodDesc) Output() pref.MessageDescriptor      { return md.outputType }
 func (md *methodDesc) IsStreamingClient() bool             { return md.isStreamingClient }
 func (md *methodDesc) IsStreamingServer() bool             { return md.isStreamingServer }
 func (md *methodDesc) Format(s fmt.State, r rune)          { pfmt.FormatDesc(s, r, md) }
 func (md *methodDesc) ProtoType(pref.MethodDescriptor)     {}
 func (md *methodDesc) ProtoInternal(pragma.DoNotImplement) {}
 
+// TODO: Remove these methods.
+func (md *methodDesc) InputType() pref.MessageDescriptor  { return md.Input() }
+func (md *methodDesc) OutputType() pref.MessageDescriptor { return md.Output() }
+
 type baseDesc struct {
 	parentFile *fileDesc
 	parent     pref.Descriptor
diff --git a/internal/fileinit/fileinit_test.go b/internal/fileinit/fileinit_test.go
index c116751..08a5883 100644
--- a/internal/fileinit/fileinit_test.go
+++ b/internal/fileinit/fileinit_test.go
@@ -70,7 +70,7 @@
 
 	// Verify that message descriptors for map entries have no Go type info.
 	mapEntryName := protoreflect.FullName("goproto.proto.test.TestAllTypes.MapInt32Int32Entry")
-	d := testpb.File_test_test_proto.Messages().ByName("TestAllTypes").Fields().ByName("map_int32_int32").MessageType()
+	d := testpb.File_test_test_proto.Messages().ByName("TestAllTypes").Fields().ByName("map_int32_int32").Message()
 	if gotName, wantName := d.FullName(), mapEntryName; gotName != wantName {
 		t.Fatalf("looked up wrong descriptor: got %v, want %v", gotName, wantName)
 	}
diff --git a/internal/impl/legacy_extension.go b/internal/impl/legacy_extension.go
index 4a60f05..e187127 100644
--- a/internal/impl/legacy_extension.go
+++ b/internal/impl/legacy_extension.go
@@ -149,7 +149,7 @@
 }
 
 func (p legacyExtensionTypes) Register(t pref.ExtensionType) {
-	if p.mi.PBType.FullName() != t.ExtendedType().FullName() {
+	if p.mi.PBType.FullName() != t.Extendee().FullName() {
 		panic("extended type mismatch")
 	}
 	if !p.mi.PBType.ExtensionRanges().Has(t.Number()) {
diff --git a/internal/impl/legacy_test.go b/internal/impl/legacy_test.go
index 84cf071..799289b 100644
--- a/internal/impl/legacy_test.go
+++ b/internal/impl/legacy_test.go
@@ -769,7 +769,7 @@
 								// Ignore New since it a constructor.
 							case "Options":
 								// Ignore descriptor options since protos are not cmperable.
-							case "EnumType", "MessageType", "ExtendedType":
+							case "Oneof", "Extendee", "Enum", "Message":
 								// Avoid descending into a dependency to avoid a cycle.
 								// Just record the full name if available.
 								//
@@ -778,6 +778,12 @@
 								if !v.IsNil() {
 									out[name] = v.Interface().(pref.Descriptor).FullName()
 								}
+							// TODO: Remove this when the methods are deleted.
+							case "OneofType", "ExtendedType", "EnumType", "MessageType":
+								v := m.Call(nil)[0]
+								if !v.IsNil() {
+									out[name] = v.Interface().(pref.Descriptor).FullName()
+								}
 							default:
 								out[name] = m.Call(nil)[0].Interface()
 							}
diff --git a/internal/impl/message.go b/internal/impl/message.go
index c719e47..6e0f904 100644
--- a/internal/impl/message.go
+++ b/internal/impl/message.go
@@ -115,8 +115,8 @@
 		switch {
 		case fd.IsWeak():
 			fi = fieldInfoForWeak(fd, specialByName["XXX_weak"])
-		case fd.OneofType() != nil:
-			fi = fieldInfoForOneof(fd, oneofsByName[fd.OneofType().Name()], oneofWrappersByNumber[fd.Number()])
+		case fd.Oneof() != nil:
+			fi = fieldInfoForOneof(fd, oneofsByName[fd.Oneof().Name()], oneofWrappersByNumber[fd.Number()])
 		case fd.IsMap():
 			fi = fieldInfoForMap(fd, fs)
 		case fd.Cardinality() == pref.Repeated:
diff --git a/internal/impl/message_field.go b/internal/impl/message_field.go
index 581481c..ec29a9b 100644
--- a/internal/impl/message_field.go
+++ b/internal/impl/message_field.go
@@ -98,8 +98,8 @@
 	if ft.Kind() != reflect.Map {
 		panic(fmt.Sprintf("invalid type: got %v, want map kind", ft))
 	}
-	keyConv := pvalue.NewLegacyConverter(ft.Key(), fd.MessageType().Fields().ByNumber(1).Kind(), legacyWrapper)
-	valConv := pvalue.NewLegacyConverter(ft.Elem(), fd.MessageType().Fields().ByNumber(2).Kind(), legacyWrapper)
+	keyConv := pvalue.NewLegacyConverter(ft.Key(), fd.Message().Fields().ByNumber(1).Kind(), legacyWrapper)
+	valConv := pvalue.NewLegacyConverter(ft.Elem(), fd.Message().Fields().ByNumber(2).Kind(), legacyWrapper)
 	fieldOffset := offsetOf(fs)
 	// TODO: Implement unsafe fast path?
 	return fieldInfo{
diff --git a/internal/legacy/extension.go b/internal/legacy/extension.go
index 19205ea..94ad7b7 100644
--- a/internal/legacy/extension.go
+++ b/internal/legacy/extension.go
@@ -64,7 +64,7 @@
 
 	// Determine the parent type if possible.
 	var parent piface.MessageV1
-	if mt, ok := t.ExtendedType().(pref.MessageType); ok {
+	if mt, ok := t.Extendee().(pref.MessageType); ok {
 		// Create a new parent message and unwrap it if possible.
 		mv := mt.New().Interface()
 		t := reflect.TypeOf(mv)
@@ -97,7 +97,7 @@
 	if t.Kind() == pref.EnumKind {
 		// Derive Go type name.
 		// For legacy enums, unwrap the wrapper to get the underlying Go type.
-		et := t.EnumType().(pref.EnumType)
+		et := t.Enum().(pref.EnumType)
 		var ev interface{} = et.New(0)
 		if u, ok := ev.(pvalue.Unwrapper); ok {
 			ev = u.ProtoUnwrap()
diff --git a/internal/legacy/file_test.go b/internal/legacy/file_test.go
index 15dca7b..20e4aa2 100644
--- a/internal/legacy/file_test.go
+++ b/internal/legacy/file_test.go
@@ -431,7 +431,7 @@
 					case "HasJSONName":
 						// Ignore this since the semantics of the field has
 						// changed across protoc and protoc-gen-go releases.
-					case "OneofType", "ExtendedType", "EnumType", "MessageType":
+					case "Oneof", "Extendee", "Enum", "Message":
 						// Avoid descending into a dependency to avoid a cycle.
 						// Just record the full name if available.
 						//
@@ -440,6 +440,12 @@
 						if !v.IsNil() {
 							out[name] = v.Interface().(pref.Descriptor).FullName()
 						}
+					// TODO: Remove this when the methods are deleted.
+					case "OneofType", "ExtendedType", "EnumType", "MessageType":
+						v := m.Call(nil)[0]
+						if !v.IsNil() {
+							out[name] = v.Interface().(pref.Descriptor).FullName()
+						}
 					default:
 						out[name] = m.Call(nil)[0].Interface()
 					}
diff --git a/internal/legacy/legacy_test.go b/internal/legacy/legacy_test.go
index 2f4dbbc..3bac3b3 100644
--- a/internal/legacy/legacy_test.go
+++ b/internal/legacy/legacy_test.go
@@ -55,24 +55,24 @@
 
 	var (
 		wantMTA = messageATypes[0]
-		wantMDA = messageATypes[0].Fields().ByNumber(1).MessageType()
+		wantMDA = messageATypes[0].Fields().ByNumber(1).Message()
 		wantMTB = messageBTypes[0]
-		wantMDB = messageBTypes[0].Fields().ByNumber(2).MessageType()
+		wantMDB = messageBTypes[0].Fields().ByNumber(2).Message()
 		wantET  = enumTypes[0]
-		wantED  = messageATypes[0].Fields().ByNumber(3).EnumType()
+		wantED  = messageATypes[0].Fields().ByNumber(3).Enum()
 	)
 
 	for _, gotMT := range messageATypes[1:] {
 		if gotMT != wantMTA {
 			t.Error("MessageType(MessageA) mismatch")
 		}
-		if gotMDA := gotMT.Fields().ByNumber(1).MessageType(); gotMDA != wantMDA {
+		if gotMDA := gotMT.Fields().ByNumber(1).Message(); gotMDA != wantMDA {
 			t.Error("MessageDescriptor(MessageA) mismatch")
 		}
-		if gotMDB := gotMT.Fields().ByNumber(2).MessageType(); gotMDB != wantMDB {
+		if gotMDB := gotMT.Fields().ByNumber(2).Message(); gotMDB != wantMDB {
 			t.Error("MessageDescriptor(MessageB) mismatch")
 		}
-		if gotED := gotMT.Fields().ByNumber(3).EnumType(); gotED != wantED {
+		if gotED := gotMT.Fields().ByNumber(3).Enum(); gotED != wantED {
 			t.Error("EnumDescriptor(Enum) mismatch")
 		}
 	}
@@ -80,13 +80,13 @@
 		if gotMT != wantMTB {
 			t.Error("MessageType(MessageB) mismatch")
 		}
-		if gotMDA := gotMT.Fields().ByNumber(1).MessageType(); gotMDA != wantMDA {
+		if gotMDA := gotMT.Fields().ByNumber(1).Message(); gotMDA != wantMDA {
 			t.Error("MessageDescriptor(MessageA) mismatch")
 		}
-		if gotMDB := gotMT.Fields().ByNumber(2).MessageType(); gotMDB != wantMDB {
+		if gotMDB := gotMT.Fields().ByNumber(2).Message(); gotMDB != wantMDB {
 			t.Error("MessageDescriptor(MessageB) mismatch")
 		}
-		if gotED := gotMT.Fields().ByNumber(3).EnumType(); gotED != wantED {
+		if gotED := gotMT.Fields().ByNumber(3).Enum(); gotED != wantED {
 			t.Error("EnumDescriptor(Enum) mismatch")
 		}
 	}
diff --git a/internal/prototype/go_type.go b/internal/prototype/go_type.go
index a9fcc39..8dba537 100644
--- a/internal/prototype/go_type.go
+++ b/internal/prototype/go_type.go
@@ -118,12 +118,12 @@
 // The type M is the concrete message type returned by NewMessage,
 // which is often, but not required to be, a pointer to a named struct type.
 func GoExtension(xd protoreflect.ExtensionDescriptor, et protoreflect.EnumType, mt protoreflect.MessageType) protoreflect.ExtensionType {
-	if xd.ExtendedType() == nil {
+	if xd.Extendee() == nil {
 		panic("field descriptor does not extend a message")
 	}
 	switch xd.Kind() {
 	case protoreflect.EnumKind:
-		if et2, ok := xd.EnumType().(protoreflect.EnumType); ok && et == nil {
+		if et2, ok := xd.Enum().(protoreflect.EnumType); ok && et == nil {
 			et = et2
 		}
 		if et == nil {
@@ -133,7 +133,7 @@
 			panic("message type provided for enum kind")
 		}
 	case protoreflect.MessageKind, protoreflect.GroupKind:
-		if mt2, ok := xd.MessageType().(protoreflect.MessageType); ok && mt == nil {
+		if mt2, ok := xd.Message().(protoreflect.MessageType); ok && mt == nil {
 			mt = mt2
 		}
 		if et != nil {
diff --git a/internal/prototype/protofile_list.go b/internal/prototype/protofile_list.go
index 188be49..f136b5f 100644
--- a/internal/prototype/protofile_list.go
+++ b/internal/prototype/protofile_list.go
@@ -101,11 +101,11 @@
 
 func (p *oneofFieldsMeta) lazyInit(parent pref.Descriptor) *oneofFields {
 	p.once.Do(func() {
-		otyp := parent.(pref.OneofDescriptor)
-		mtyp, _ := parent.Parent()
-		fs := mtyp.(pref.MessageDescriptor).Fields()
+		od := parent.(pref.OneofDescriptor)
+		md, _ := parent.Parent()
+		fs := md.(pref.MessageDescriptor).Fields()
 		for i := 0; i < fs.Len(); i++ {
-			if f := fs.Get(i); otyp == f.OneofType() {
+			if f := fs.Get(i); od == f.Oneof() {
 				p.typs = append(p.typs, f)
 			}
 		}
diff --git a/internal/prototype/protofile_type.go b/internal/prototype/protofile_type.go
index 9f23ea2..271fdbc 100644
--- a/internal/prototype/protofile_type.go
+++ b/internal/prototype/protofile_type.go
@@ -160,20 +160,26 @@
 }
 func (t fieldDesc) IsWeak() bool { return t.f.IsWeak }
 func (t fieldDesc) IsMap() bool {
-	mt := t.MessageType()
+	mt := t.Message()
 	return mt != nil && mt.IsMapEntry()
 }
 func (t fieldDesc) HasDefault() bool                           { return t.f.Default.IsValid() }
 func (t fieldDesc) Default() pref.Value                        { return t.f.dv.value(t, t.f.Default) }
 func (t fieldDesc) DefaultEnumValue() pref.EnumValueDescriptor { return t.f.dv.enum(t, t.f.Default) }
-func (t fieldDesc) OneofType() pref.OneofDescriptor            { return t.f.ot.lazyInit(t, t.f.OneofName) }
-func (t fieldDesc) ExtendedType() pref.MessageDescriptor       { return nil }
-func (t fieldDesc) MessageType() pref.MessageDescriptor        { return t.f.mt.lazyInit(t, &t.f.MessageType) }
-func (t fieldDesc) EnumType() pref.EnumDescriptor              { return t.f.et.lazyInit(t, &t.f.EnumType) }
+func (t fieldDesc) Oneof() pref.OneofDescriptor                { return t.f.ot.lazyInit(t, t.f.OneofName) }
+func (t fieldDesc) Extendee() pref.MessageDescriptor           { return nil }
+func (t fieldDesc) Enum() pref.EnumDescriptor                  { return t.f.et.lazyInit(t, &t.f.EnumType) }
+func (t fieldDesc) Message() pref.MessageDescriptor            { return t.f.mt.lazyInit(t, &t.f.MessageType) }
 func (t fieldDesc) Format(s fmt.State, r rune)                 { pfmt.FormatDesc(s, r, t) }
 func (t fieldDesc) ProtoType(pref.FieldDescriptor)             {}
 func (t fieldDesc) ProtoInternal(pragma.DoNotImplement)        {}
 
+// TODO: Remove these methods.
+func (t fieldDesc) OneofType() pref.OneofDescriptor      { return t.Oneof() }
+func (t fieldDesc) ExtendedType() pref.MessageDescriptor { return t.Extendee() }
+func (t fieldDesc) EnumType() pref.EnumDescriptor        { return t.Enum() }
+func (t fieldDesc) MessageType() pref.MessageDescriptor  { return t.Message() }
+
 func isPacked(packed OptionalBool, s pref.Syntax, c pref.Cardinality, k pref.Kind) bool {
 	if packed == False || (packed == DefaultBool && s == pref.Proto2) {
 		return false
@@ -289,17 +295,19 @@
 func (t extensionDesc) HasDefault() bool                           { return t.x.Default.IsValid() }
 func (t extensionDesc) Default() pref.Value                        { return t.x.dv.value(t, t.x.Default) }
 func (t extensionDesc) DefaultEnumValue() pref.EnumValueDescriptor { return t.x.dv.enum(t, t.x.Default) }
-func (t extensionDesc) OneofType() pref.OneofDescriptor            { return nil }
-func (t extensionDesc) ExtendedType() pref.MessageDescriptor {
-	return t.x.xt.lazyInit(t, &t.x.ExtendedType)
-}
-func (t extensionDesc) MessageType() pref.MessageDescriptor {
-	return t.x.mt.lazyInit(t, &t.x.MessageType)
-}
-func (t extensionDesc) EnumType() pref.EnumDescriptor       { return t.x.et.lazyInit(t, &t.x.EnumType) }
-func (t extensionDesc) Format(s fmt.State, r rune)          { pfmt.FormatDesc(s, r, t) }
-func (t extensionDesc) ProtoType(pref.FieldDescriptor)      {}
-func (t extensionDesc) ProtoInternal(pragma.DoNotImplement) {}
+func (t extensionDesc) Oneof() pref.OneofDescriptor                { return nil }
+func (t extensionDesc) Extendee() pref.MessageDescriptor           { return t.x.xt.lazyInit(t, &t.x.ExtendedType) }
+func (t extensionDesc) Enum() pref.EnumDescriptor                  { return t.x.et.lazyInit(t, &t.x.EnumType) }
+func (t extensionDesc) Message() pref.MessageDescriptor            { return t.x.mt.lazyInit(t, &t.x.MessageType) }
+func (t extensionDesc) Format(s fmt.State, r rune)                 { pfmt.FormatDesc(s, r, t) }
+func (t extensionDesc) ProtoType(pref.FieldDescriptor)             {}
+func (t extensionDesc) ProtoInternal(pragma.DoNotImplement)        {}
+
+// TODO: Remove these methods.
+func (t extensionDesc) OneofType() pref.OneofDescriptor      { return t.Oneof() }
+func (t extensionDesc) ExtendedType() pref.MessageDescriptor { return t.Extendee() }
+func (t extensionDesc) EnumType() pref.EnumDescriptor        { return t.Enum() }
+func (t extensionDesc) MessageType() pref.MessageDescriptor  { return t.Message() }
 
 type enumMeta struct {
 	inheritedMeta
@@ -377,14 +385,18 @@
 func (t methodDesc) FullName() pref.FullName             { return t.m.fullName }
 func (t methodDesc) IsPlaceholder() bool                 { return false }
 func (t methodDesc) Options() pref.ProtoMessage          { return altOptions(t.m.Options, descopts.Method) }
-func (t methodDesc) InputType() pref.MessageDescriptor   { return t.m.mit.lazyInit(t, &t.m.InputType) }
-func (t methodDesc) OutputType() pref.MessageDescriptor  { return t.m.mot.lazyInit(t, &t.m.OutputType) }
+func (t methodDesc) Input() pref.MessageDescriptor       { return t.m.mit.lazyInit(t, &t.m.InputType) }
+func (t methodDesc) Output() pref.MessageDescriptor      { return t.m.mot.lazyInit(t, &t.m.OutputType) }
 func (t methodDesc) IsStreamingClient() bool             { return t.m.IsStreamingClient }
 func (t methodDesc) IsStreamingServer() bool             { return t.m.IsStreamingServer }
 func (t methodDesc) Format(s fmt.State, r rune)          { pfmt.FormatDesc(s, r, t) }
 func (t methodDesc) ProtoType(pref.MethodDescriptor)     {}
 func (t methodDesc) ProtoInternal(pragma.DoNotImplement) {}
 
+// TODO: Remove these methods.
+func (t methodDesc) InputType() pref.MessageDescriptor  { return t.Input() }
+func (t methodDesc) OutputType() pref.MessageDescriptor { return t.Output() }
+
 type defaultValue struct {
 	once sync.Once
 	val  pref.Value
@@ -417,12 +429,12 @@
 				// default value for an enum value is the wrong type.
 				switch v := v.Interface().(type) {
 				case string:
-					if ev := t.EnumType().Values().ByName(pref.Name(v)); ev != nil {
+					if ev := t.Enum().Values().ByName(pref.Name(v)); ev != nil {
 						p.eval = ev
 						p.val = pref.ValueOf(p.eval.Number())
 					}
 				case pref.EnumNumber:
-					p.eval = t.EnumType().Values().ByNumber(v)
+					p.eval = t.Enum().Values().ByNumber(v)
 				}
 			case pref.BytesKind:
 				// Store a copy of the default bytes, so that we can detect
@@ -455,8 +467,8 @@
 		case pref.EnumKind:
 			p.val = zeroEnum
 			if t.Syntax() == pref.Proto2 {
-				if et := t.EnumType(); et != nil {
-					if vs := et.Values(); vs.Len() > 0 {
+				if ed := t.Enum(); ed != nil {
+					if vs := ed.Values(); vs.Len() > 0 {
 						p.val = pref.ValueOf(vs.Get(0).Number())
 					}
 				}
diff --git a/internal/prototype/standalone_type.go b/internal/prototype/standalone_type.go
index 4dd681b..098e5ae 100644
--- a/internal/prototype/standalone_type.go
+++ b/internal/prototype/standalone_type.go
@@ -89,10 +89,16 @@
 func (t standaloneExtension) DefaultEnumValue() pref.EnumValueDescriptor {
 	return t.x.dv.enum(t, t.x.Default)
 }
-func (t standaloneExtension) OneofType() pref.OneofDescriptor      { return nil }
-func (t standaloneExtension) MessageType() pref.MessageDescriptor  { return t.x.MessageType }
-func (t standaloneExtension) EnumType() pref.EnumDescriptor        { return t.x.EnumType }
-func (t standaloneExtension) ExtendedType() pref.MessageDescriptor { return t.x.ExtendedType }
-func (t standaloneExtension) Format(s fmt.State, r rune)           { pfmt.FormatDesc(s, r, t) }
-func (t standaloneExtension) ProtoType(pref.FieldDescriptor)       {}
-func (t standaloneExtension) ProtoInternal(pragma.DoNotImplement)  {}
+func (t standaloneExtension) Oneof() pref.OneofDescriptor         { return nil }
+func (t standaloneExtension) Extendee() pref.MessageDescriptor    { return t.x.ExtendedType }
+func (t standaloneExtension) Enum() pref.EnumDescriptor           { return t.x.EnumType }
+func (t standaloneExtension) Message() pref.MessageDescriptor     { return t.x.MessageType }
+func (t standaloneExtension) Format(s fmt.State, r rune)          { pfmt.FormatDesc(s, r, t) }
+func (t standaloneExtension) ProtoType(pref.FieldDescriptor)      {}
+func (t standaloneExtension) ProtoInternal(pragma.DoNotImplement) {}
+
+// TODO: Remove these methods.
+func (t standaloneExtension) OneofType() pref.OneofDescriptor      { return t.Oneof() }
+func (t standaloneExtension) ExtendedType() pref.MessageDescriptor { return t.Extendee() }
+func (t standaloneExtension) EnumType() pref.EnumDescriptor        { return t.Enum() }
+func (t standaloneExtension) MessageType() pref.MessageDescriptor  { return t.Message() }
diff --git a/internal/prototype/type_test.go b/internal/prototype/type_test.go
index fa4258e..a8c171b 100644
--- a/internal/prototype/type_test.go
+++ b/internal/prototype/type_test.go
@@ -391,42 +391,42 @@
 				"Fields": M{
 					"Len": 2,
 					"ByNumber:1": M{
-						"Parent":       M{"FullName": pref.FullName("test.A")},
-						"Index":        0,
-						"Name":         pref.Name("key"),
-						"FullName":     pref.FullName("test.A.key"),
-						"Number":       pref.FieldNumber(1),
-						"Cardinality":  pref.Optional,
-						"Kind":         pref.StringKind,
-						"Options":      &descriptorpb.FieldOptions{Deprecated: scalar.Bool(true)},
-						"HasJSONName":  false,
-						"JSONName":     "key",
-						"IsPacked":     false,
-						"IsMap":        false,
-						"IsWeak":       false,
-						"Default":      "",
-						"OneofType":    nil,
-						"ExtendedType": nil,
-						"MessageType":  nil,
-						"EnumType":     nil,
+						"Parent":      M{"FullName": pref.FullName("test.A")},
+						"Index":       0,
+						"Name":        pref.Name("key"),
+						"FullName":    pref.FullName("test.A.key"),
+						"Number":      pref.FieldNumber(1),
+						"Cardinality": pref.Optional,
+						"Kind":        pref.StringKind,
+						"Options":     &descriptorpb.FieldOptions{Deprecated: scalar.Bool(true)},
+						"HasJSONName": false,
+						"JSONName":    "key",
+						"IsPacked":    false,
+						"IsMap":       false,
+						"IsWeak":      false,
+						"Default":     "",
+						"Oneof":       nil,
+						"Extendee":    nil,
+						"Message":     nil,
+						"Enum":        nil,
 					},
 					"ByNumber:2": M{
-						"Parent":       M{"FullName": pref.FullName("test.A")},
-						"Index":        1,
-						"Name":         pref.Name("value"),
-						"FullName":     pref.FullName("test.A.value"),
-						"Number":       pref.FieldNumber(2),
-						"Cardinality":  pref.Optional,
-						"Kind":         pref.MessageKind,
-						"JSONName":     "value",
-						"IsPacked":     false,
-						"IsMap":        false,
-						"IsWeak":       false,
-						"Default":      nil,
-						"OneofType":    nil,
-						"ExtendedType": nil,
-						"MessageType":  M{"FullName": pref.FullName("test.B"), "IsPlaceholder": false},
-						"EnumType":     nil,
+						"Parent":      M{"FullName": pref.FullName("test.A")},
+						"Index":       1,
+						"Name":        pref.Name("value"),
+						"FullName":    pref.FullName("test.A.value"),
+						"Number":      pref.FieldNumber(2),
+						"Cardinality": pref.Optional,
+						"Kind":        pref.MessageKind,
+						"JSONName":    "value",
+						"IsPacked":    false,
+						"IsMap":       false,
+						"IsWeak":      false,
+						"Default":     nil,
+						"Oneof":       nil,
+						"Extendee":    nil,
+						"Message":     M{"FullName": pref.FullName("test.B"), "IsPlaceholder": false},
+						"Enum":        nil,
 					},
 					"ByNumber:3": nil,
 				},
@@ -444,11 +444,11 @@
 					"Len":                  6,
 					"ByJSONName:field_one": nil,
 					"ByJSONName:fieldOne": M{
-						"Name":      pref.Name("field_one"),
-						"Index":     0,
-						"JSONName":  "fieldOne",
-						"Default":   "hello, \"world!\"\n",
-						"OneofType": M{"Name": pref.Name("O1"), "IsPlaceholder": false},
+						"Name":     pref.Name("field_one"),
+						"Index":    0,
+						"JSONName": "fieldOne",
+						"Default":  "hello, \"world!\"\n",
+						"Oneof":    M{"Name": pref.Name("O1"), "IsPlaceholder": false},
 					},
 					"ByJSONName:fieldTwo": nil,
 					"ByJSONName:Field2": M{
@@ -457,20 +457,20 @@
 						"HasJSONName": true,
 						"JSONName":    "Field2",
 						"Default":     pref.EnumNumber(1),
-						"OneofType":   M{"Name": pref.Name("O2"), "IsPlaceholder": false},
+						"Oneof":       M{"Name": pref.Name("O2"), "IsPlaceholder": false},
 					},
 					"ByName:fieldThree": nil,
 					"ByName:field_three": M{
-						"IsMap":       false,
-						"MessageType": M{"FullName": pref.FullName("test.C"), "IsPlaceholder": false},
-						"OneofType":   M{"Name": pref.Name("O2"), "IsPlaceholder": false},
+						"IsMap":   false,
+						"Message": M{"FullName": pref.FullName("test.C"), "IsPlaceholder": false},
+						"Oneof":   M{"Name": pref.Name("O2"), "IsPlaceholder": false},
 					},
 					"ByNumber:12": nil,
 					"ByNumber:4": M{
 						"Cardinality": pref.Repeated,
 						"IsMap":       true,
 						"Default":     nil,
-						"MessageType": M{"FullName": pref.FullName("test.A"), "IsPlaceholder": false},
+						"Message":     M{"FullName": pref.FullName("test.A"), "IsPlaceholder": false},
 					},
 					"ByNumber:5": M{
 						"Cardinality": pref.Repeated,
@@ -481,7 +481,7 @@
 					"ByNumber:6": M{
 						"Cardinality": pref.Required,
 						"Default":     []byte(nil),
-						"OneofType":   nil,
+						"Oneof":       nil,
 					},
 				},
 				"Oneofs": M{
@@ -601,14 +601,14 @@
 		"Extensions": M{
 			"Len": 1,
 			"ByName:X": M{
-				"Name":         pref.Name("X"),
-				"Number":       pref.FieldNumber(1000),
-				"Cardinality":  pref.Repeated,
-				"Kind":         pref.MessageKind,
-				"IsPacked":     false,
-				"MessageType":  M{"FullName": pref.FullName("test.C"), "IsPlaceholder": false},
-				"ExtendedType": M{"FullName": pref.FullName("test.B"), "IsPlaceholder": false},
-				"Options":      &descriptorpb.FieldOptions{Packed: scalar.Bool(true)},
+				"Name":        pref.Name("X"),
+				"Number":      pref.FieldNumber(1000),
+				"Cardinality": pref.Repeated,
+				"Kind":        pref.MessageKind,
+				"IsPacked":    false,
+				"Message":     M{"FullName": pref.FullName("test.C"), "IsPlaceholder": false},
+				"Extendee":    M{"FullName": pref.FullName("test.B"), "IsPlaceholder": false},
+				"Options":     &descriptorpb.FieldOptions{Packed: scalar.Bool(true)},
 			},
 		},
 		"Services": M{
@@ -625,8 +625,8 @@
 						"Parent":            M{"FullName": pref.FullName("test.S")},
 						"Name":              pref.Name("M"),
 						"FullName":          pref.FullName("test.S.M"),
-						"InputType":         M{"FullName": pref.FullName("test.A"), "IsPlaceholder": false},
-						"OutputType":        M{"FullName": pref.FullName("test.C.A"), "IsPlaceholder": false},
+						"Input":             M{"FullName": pref.FullName("test.A"), "IsPlaceholder": false},
+						"Output":            M{"FullName": pref.FullName("test.C.A"), "IsPlaceholder": false},
 						"IsStreamingClient": true,
 						"IsStreamingServer": true,
 						"Options":           &descriptorpb.MethodOptions{Deprecated: scalar.Bool(true)},
@@ -728,7 +728,7 @@
 			Cardinality: optional
 			Kind:        message
 			JSONName:    "value"
-			MessageType: test.B
+			Message:     test.B
 		}]
 	}, {
 		Name: B
@@ -740,7 +740,7 @@
 			JSONName:    "fieldOne"
 			HasDefault:  true
 			Default:     "hello, \"world!\"\n"
-			OneofType:   O1
+			Oneof:       O1
 		}, {
 			Name:        field_two
 			Number:      2
@@ -750,16 +750,16 @@
 			JSONName:    "Field2"
 			HasDefault:  true
 			Default:     1
-			OneofType:   O2
-			EnumType:    test.E1
+			Oneof:       O2
+			Enum:        test.E1
 		}, {
 			Name:        field_three
 			Number:      3
 			Cardinality: optional
 			Kind:        message
 			JSONName:    "fieldThree"
-			OneofType:   O2
-			MessageType: test.C
+			Oneof:       O2
+			Message:     test.C
 		}, {
 			Name:        field_four
 			Number:      4
@@ -768,7 +768,7 @@
 			HasJSONName: true
 			JSONName:    "Field4"
 			IsMap:       true
-			MessageType: test.A
+			Message:     test.A
 		}, {
 			Name:        field_five
 			Number:      5
@@ -817,12 +817,12 @@
 			]
 		}]
 		Extensions: [{
-			Name:         X
-			Number:       1000
-			Cardinality:  repeated
-			Kind:         message
-			ExtendedType: test.B
-			MessageType:  test.C
+			Name:        X
+			Number:      1000
+			Cardinality: repeated
+			Kind:        message
+			Extendee:    test.B
+			Message:     test.C
 		}]
 	}]
 	Enums: [{
@@ -835,19 +835,19 @@
 		ReservedRanges: [10:20, 30]
 	}]
 	Extensions: [{
-		Name:         X
-		Number:       1000
-		Cardinality:  repeated
-		Kind:         message
-		ExtendedType: test.B
-		MessageType:  test.C
+		Name:        X
+		Number:      1000
+		Cardinality: repeated
+		Kind:        message
+		Extendee:    test.B
+		Message:     test.C
 	}]
 	Services: [{
 		Name: S
 		Methods: [{
 			Name:              M
-			InputType:         test.A
-			OutputType:        test.C.A
+			Input:             test.A
+			Output:            test.C.A
 			IsStreamingClient: true
 			IsStreamingServer: true
 		}]
diff --git a/internal/typefmt/desc_test.go b/internal/typefmt/desc_test.go
index 346362b..6fe9017 100644
--- a/internal/typefmt/desc_test.go
+++ b/internal/typefmt/desc_test.go
@@ -27,6 +27,14 @@
 		"DescriptorProto":       true,
 		"ExtensionRangeOptions": true,
 		"Options":               true,
+
+		// TODO: Remove these when the methods are removed.
+		"OneofType":    true,
+		"ExtendedType": true,
+		"EnumType":     true,
+		"MessageType":  true,
+		"InputType":    true,
+		"OutputType":   true,
 	}
 
 	for rt, m := range descriptorAccessors {
diff --git a/internal/typefmt/stringer.go b/internal/typefmt/stringer.go
index feb28ef..eec6fd2 100644
--- a/internal/typefmt/stringer.go
+++ b/internal/typefmt/stringer.go
@@ -106,12 +106,12 @@
 var descriptorAccessors = map[reflect.Type][]string{
 	reflect.TypeOf((*pref.FileDescriptor)(nil)).Elem():      {"Path", "Package", "Imports", "Messages", "Enums", "Extensions", "Services"},
 	reflect.TypeOf((*pref.MessageDescriptor)(nil)).Elem():   {"IsMapEntry", "Fields", "Oneofs", "ReservedNames", "ReservedRanges", "RequiredNumbers", "ExtensionRanges", "Messages", "Enums", "Extensions"},
-	reflect.TypeOf((*pref.FieldDescriptor)(nil)).Elem():     {"Number", "Cardinality", "Kind", "HasJSONName", "JSONName", "IsPacked", "IsMap", "IsWeak", "HasDefault", "Default", "OneofType", "ExtendedType", "MessageType", "EnumType"},
+	reflect.TypeOf((*pref.FieldDescriptor)(nil)).Elem():     {"Number", "Cardinality", "Kind", "HasJSONName", "JSONName", "IsPacked", "IsMap", "IsWeak", "HasDefault", "Default", "Oneof", "Extendee", "Message", "Enum"},
 	reflect.TypeOf((*pref.OneofDescriptor)(nil)).Elem():     {"Fields"}, // not directly used; must keep in sync with formatDescOpt
 	reflect.TypeOf((*pref.EnumDescriptor)(nil)).Elem():      {"Values", "ReservedNames", "ReservedRanges"},
 	reflect.TypeOf((*pref.EnumValueDescriptor)(nil)).Elem(): {"Number"},
 	reflect.TypeOf((*pref.ServiceDescriptor)(nil)).Elem():   {"Methods"},
-	reflect.TypeOf((*pref.MethodDescriptor)(nil)).Elem():    {"InputType", "OutputType", "IsStreamingClient", "IsStreamingServer"},
+	reflect.TypeOf((*pref.MethodDescriptor)(nil)).Elem():    {"Input", "Output", "IsStreamingClient", "IsStreamingServer"},
 }
 
 func FormatDesc(s fmt.State, r rune, t pref.Descriptor) {
diff --git a/proto/decode.go b/proto/decode.go
index 0b1aa3f..5a867a2 100644
--- a/proto/decode.go
+++ b/proto/decode.go
@@ -118,7 +118,7 @@
 		// TODO: C++ merges into oneofs, while v1 does not.
 		// Evaluate which behavior to pick.
 		var m protoreflect.Message
-		if knownFields.Has(num) && field.OneofType() == nil {
+		if knownFields.Has(num) && field.Oneof() == nil {
 			m = knownFields.Get(num).Message()
 		} else {
 			m = knownFields.NewMessage(num)
@@ -144,8 +144,8 @@
 		return 0, wire.ParseError(n)
 	}
 	var (
-		keyField = field.MessageType().Fields().ByNumber(1)
-		valField = field.MessageType().Fields().ByNumber(2)
+		keyField = field.Message().Fields().ByNumber(1)
+		valField = field.Message().Fields().ByNumber(2)
 		key      protoreflect.Value
 		val      protoreflect.Value
 		haveKey  bool
diff --git a/proto/encode.go b/proto/encode.go
index 8635790..1b48b41 100644
--- a/proto/encode.go
+++ b/proto/encode.go
@@ -184,7 +184,7 @@
 		b = wire.AppendTag(b, num, wireTypes[kind])
 		return o.marshalSingular(b, num, field, value)
 	case field.IsMap():
-		return o.marshalMap(b, num, kind, field.MessageType(), value.Map())
+		return o.marshalMap(b, num, kind, field.Message(), value.Map())
 	case field.IsPacked():
 		return o.marshalPacked(b, num, field, value.List())
 	default:
diff --git a/proto/isinit.go b/proto/isinit.go
index 33dfb64..08edbd8 100644
--- a/proto/isinit.go
+++ b/proto/isinit.go
@@ -48,12 +48,12 @@
 		}
 		// Look for fields containing a message: Messages, groups, and maps
 		// with a message or group value.
-		ft := field.MessageType()
-		if ft == nil {
+		md := field.Message()
+		if md == nil {
 			return true
 		}
 		if field.IsMap() {
-			if ft.Fields().ByNumber(2).MessageType() == nil {
+			if md.Fields().ByNumber(2).Message() == nil {
 				return true
 			}
 		}
diff --git a/proto/size.go b/proto/size.go
index ab21cb3..3bc5a3c 100644
--- a/proto/size.go
+++ b/proto/size.go
@@ -61,7 +61,7 @@
 	case field.Cardinality() != protoreflect.Repeated:
 		return wire.SizeTag(num) + sizeSingular(num, kind, value)
 	case field.IsMap():
-		return sizeMap(num, kind, field.MessageType(), value.Map())
+		return sizeMap(num, kind, field.Message(), value.Map())
 	case field.IsPacked():
 		return sizePacked(num, kind, value.List())
 	default:
diff --git a/protogen/protogen.go b/protogen/protogen.go
index 9dd48fc..41c2392 100644
--- a/protogen/protogen.go
+++ b/protogen/protogen.go
@@ -582,12 +582,12 @@
 	seenOneofs := make(map[int]bool)
 	for _, field := range message.Fields {
 		field.GoName = makeNameUnique(field.GoName, true)
-		if field.OneofType != nil {
-			if !seenOneofs[field.OneofType.Desc.Index()] {
+		if field.Oneof != nil {
+			if !seenOneofs[field.Oneof.Desc.Index()] {
 				// If this is a field in a oneof that we haven't seen before,
 				// make the name for that oneof unique as well.
-				field.OneofType.GoName = makeNameUnique(field.OneofType.GoName, false)
-				seenOneofs[field.OneofType.Desc.Index()] = true
+				field.Oneof.GoName = makeNameUnique(field.Oneof.GoName, false)
+				seenOneofs[field.Oneof.Desc.Index()] = true
 			}
 		}
 	}
@@ -626,32 +626,32 @@
 	// '{{GoName}}' and a getter method named 'Get{{GoName}}'.
 	GoName string
 
-	ParentMessage *Message // message in which this field is defined; nil if top-level extension
-	ExtendedType  *Message // extended message for extension fields; nil otherwise
-	MessageType   *Message // type for message or group fields; nil otherwise
-	EnumType      *Enum    // type for enum fields; nil otherwise
-	OneofType     *Oneof   // containing oneof; nil if not part of a oneof
-	Location      Location // location of this field
+	Parent   *Message // message in which this field is defined; nil if top-level extension
+	Oneof    *Oneof   // containing oneof; nil if not part of a oneof
+	Extendee *Message // extended message for extension fields; nil otherwise
+	Enum     *Enum    // type for enum fields; nil otherwise
+	Message  *Message // type for message or group fields; nil otherwise
+	Location Location // location of this field
 }
 
 func newField(gen *Plugin, f *File, message *Message, desc protoreflect.FieldDescriptor) *Field {
 	var loc Location
 	switch {
-	case desc.ExtendedType() != nil && message == nil:
+	case desc.Extendee() != nil && message == nil:
 		loc = f.location(fieldnum.FileDescriptorProto_Extension, int32(desc.Index()))
-	case desc.ExtendedType() != nil && message != nil:
+	case desc.Extendee() != nil && message != nil:
 		loc = message.Location.appendPath(fieldnum.DescriptorProto_Extension, int32(desc.Index()))
 	default:
 		loc = message.Location.appendPath(fieldnum.DescriptorProto_Field, int32(desc.Index()))
 	}
 	field := &Field{
-		Desc:          desc,
-		GoName:        camelCase(string(desc.Name())),
-		ParentMessage: message,
-		Location:      loc,
+		Desc:     desc,
+		GoName:   camelCase(string(desc.Name())),
+		Parent:   message,
+		Location: loc,
 	}
-	if desc.OneofType() != nil {
-		field.OneofType = message.Oneofs[desc.OneofType().Index()]
+	if desc.Oneof() != nil {
+		field.Oneof = message.Oneofs[desc.Oneof().Index()]
 	}
 	return field
 }
@@ -663,27 +663,27 @@
 	desc := field.Desc
 	switch desc.Kind() {
 	case protoreflect.MessageKind, protoreflect.GroupKind:
-		mname := desc.MessageType().FullName()
+		mname := desc.Message().FullName()
 		message, ok := gen.messagesByName[mname]
 		if !ok {
 			return fmt.Errorf("field %v: no descriptor for type %v", desc.FullName(), mname)
 		}
-		field.MessageType = message
+		field.Message = message
 	case protoreflect.EnumKind:
-		ename := field.Desc.EnumType().FullName()
+		ename := field.Desc.Enum().FullName()
 		enum, ok := gen.enumsByName[ename]
 		if !ok {
 			return fmt.Errorf("field %v: no descriptor for enum %v", desc.FullName(), ename)
 		}
-		field.EnumType = enum
+		field.Enum = enum
 	}
-	if desc.ExtendedType() != nil {
-		mname := desc.ExtendedType().FullName()
+	if desc.Extendee() != nil {
+		mname := desc.Extendee().FullName()
 		message, ok := gen.messagesByName[mname]
 		if !ok {
 			return fmt.Errorf("field %v: no descriptor for type %v", desc.FullName(), mname)
 		}
-		field.ExtendedType = message
+		field.Extendee = message
 	}
 	return nil
 }
@@ -692,18 +692,19 @@
 type Oneof struct {
 	Desc protoreflect.OneofDescriptor
 
-	GoName        string   // Go field name of this oneof
-	ParentMessage *Message // message in which this oneof occurs
-	Fields        []*Field // fields that are part of this oneof
-	Location      Location // location of this oneof
+	GoName string   // Go field name of this oneof
+	Parent *Message // message in which this oneof occurs
+	Fields []*Field // fields that are part of this oneof
+
+	Location Location // location of this oneof
 }
 
 func newOneof(gen *Plugin, f *File, message *Message, desc protoreflect.OneofDescriptor) *Oneof {
 	return &Oneof{
-		Desc:          desc,
-		ParentMessage: message,
-		GoName:        camelCase(string(desc.Name())),
-		Location:      message.Location.appendPath(fieldnum.DescriptorProto_OneofDecl, int32(desc.Index())),
+		Desc:     desc,
+		Parent:   message,
+		GoName:   camelCase(string(desc.Name())),
+		Location: message.Location.appendPath(fieldnum.DescriptorProto_OneofDecl, int32(desc.Index())),
 	}
 }
 
@@ -717,9 +718,10 @@
 type Enum struct {
 	Desc protoreflect.EnumDescriptor
 
-	GoIdent  GoIdent      // name of the generated Go type
-	Values   []*EnumValue // enum values
-	Location Location     // location of this enum
+	GoIdent GoIdent      // name of the generated Go type
+	Values  []*EnumValue // enum values
+
+	Location Location // location of this enum
 }
 
 func newEnum(gen *Plugin, f *File, parent *Message, desc protoreflect.EnumDescriptor) *Enum {
@@ -745,7 +747,8 @@
 type EnumValue struct {
 	Desc protoreflect.EnumValueDescriptor
 
-	GoIdent  GoIdent  // name of the generated Go type
+	GoIdent GoIdent // name of the generated Go type
+
 	Location Location // location of this enum value
 }
 
@@ -770,9 +773,10 @@
 type Service struct {
 	Desc protoreflect.ServiceDescriptor
 
-	GoName   string
-	Location Location  // location of this service
-	Methods  []*Method // service method definitions
+	GoName  string
+	Methods []*Method // service method definitions
+
+	Location Location // location of this service
 }
 
 func newService(gen *Plugin, f *File, desc protoreflect.ServiceDescriptor) *Service {
@@ -791,19 +795,20 @@
 type Method struct {
 	Desc protoreflect.MethodDescriptor
 
-	GoName        string
-	ParentService *Service
-	Location      Location // location of this method
-	InputType     *Message
-	OutputType    *Message
+	GoName string
+	Parent *Service
+	Input  *Message
+	Output *Message
+
+	Location Location // location of this method
 }
 
 func newMethod(gen *Plugin, f *File, service *Service, desc protoreflect.MethodDescriptor) *Method {
 	method := &Method{
-		Desc:          desc,
-		GoName:        camelCase(string(desc.Name())),
-		ParentService: service,
-		Location:      service.Location.appendPath(fieldnum.ServiceDescriptorProto_Method, int32(desc.Index())),
+		Desc:     desc,
+		GoName:   camelCase(string(desc.Name())),
+		Parent:   service,
+		Location: service.Location.appendPath(fieldnum.ServiceDescriptorProto_Method, int32(desc.Index())),
 	}
 	return method
 }
@@ -811,19 +816,19 @@
 func (method *Method) init(gen *Plugin) error {
 	desc := method.Desc
 
-	inName := desc.InputType().FullName()
+	inName := desc.Input().FullName()
 	in, ok := gen.messagesByName[inName]
 	if !ok {
 		return fmt.Errorf("method %v: no descriptor for type %v", desc.FullName(), inName)
 	}
-	method.InputType = in
+	method.Input = in
 
-	outName := desc.OutputType().FullName()
+	outName := desc.Output().FullName()
 	out, ok := gen.messagesByName[outName]
 	if !ok {
 		return fmt.Errorf("method %v: no descriptor for type %v", desc.FullName(), outName)
 	}
-	method.OutputType = out
+	method.Output = out
 
 	return nil
 }
diff --git a/reflect/protodesc/toproto.go b/reflect/protodesc/toproto.go
index efe0572..ad288a2 100644
--- a/reflect/protodesc/toproto.go
+++ b/reflect/protodesc/toproto.go
@@ -100,14 +100,14 @@
 		Number:   scalar.Int32(int32(field.Number())),
 		Label:    descriptorpb.FieldDescriptorProto_Label(field.Cardinality()).Enum(),
 		Type:     descriptorpb.FieldDescriptorProto_Type(field.Kind()).Enum(),
-		Extendee: fullNameOf(field.ExtendedType()),
+		Extendee: fullNameOf(field.Extendee()),
 		Options:  field.Options().(*descriptorpb.FieldOptions),
 	}
 	switch field.Kind() {
 	case protoreflect.EnumKind:
-		p.TypeName = fullNameOf(field.EnumType())
+		p.TypeName = fullNameOf(field.Enum())
 	case protoreflect.MessageKind, protoreflect.GroupKind:
-		p.TypeName = fullNameOf(field.MessageType())
+		p.TypeName = fullNameOf(field.Message())
 	}
 	if field.HasJSONName() {
 		p.JsonName = scalar.String(field.JSONName())
@@ -125,7 +125,7 @@
 			p.DefaultValue = scalar.String(def)
 		}
 	}
-	if oneof := field.OneofType(); oneof != nil {
+	if oneof := field.Oneof(); oneof != nil {
 		p.OneofIndex = scalar.Int32(int32(oneof.Index()))
 	}
 	return p
@@ -191,8 +191,8 @@
 func ToMethodDescriptorProto(method protoreflect.MethodDescriptor) *descriptorpb.MethodDescriptorProto {
 	p := &descriptorpb.MethodDescriptorProto{
 		Name:       scalar.String(string(method.Name())),
-		InputType:  fullNameOf(method.InputType()),
-		OutputType: fullNameOf(method.OutputType()),
+		InputType:  fullNameOf(method.Input()),
+		OutputType: fullNameOf(method.Output()),
 		Options:    method.Options().(*descriptorpb.MethodOptions),
 	}
 	if method.IsStreamingClient() {
diff --git a/reflect/protoreflect/type.go b/reflect/protoreflect/type.go
index 50324d6..6a56f43 100644
--- a/reflect/protoreflect/type.go
+++ b/reflect/protoreflect/type.go
@@ -297,26 +297,39 @@
 	// The Value type is determined by the Kind.
 	Default() Value
 
-	// DefaultEnumValue returns the EnummValueDescriptor for the default value
+	// DefaultEnumValue returns the EnumValueDescriptor for the default value
 	// of an enum field, and is nil for any other kind of field.
 	DefaultEnumValue() EnumValueDescriptor
 
-	// OneofType is the containing oneof that this field belongs to,
+	// Oneof is the containing oneof that this field belongs to,
 	// and is nil if this field is not part of a oneof.
-	OneofType() OneofDescriptor
+	Oneof() OneofDescriptor
 
-	// ExtendedType returns a MessageDescriptor for the extended message
+	// Extendee returns a message descriptor for the extended message
 	// that this extension field belongs in.
 	// It returns nil if this field is not an extension.
+	Extendee() MessageDescriptor
+
+	// Enum is the enum descriptor if Kind is EnumKind.
+	// It returns nil for any other Kind.
+	Enum() EnumDescriptor
+
+	// Message is the message descriptor if Kind is
+	// MessageKind or GroupKind. It returns nil for any other Kind.
+	Message() MessageDescriptor
+
+	// OneofType has been renamed to Oneof.
+	// Deprecated: Use Oneof instead; this will be removed.
+	OneofType() OneofDescriptor
+	// ExtendedType has been renamed to Extendee.
+	// Deprecated: Use Extendee instead; this will be removed.
 	ExtendedType() MessageDescriptor
-
-	// MessageType is the message type if Kind is MessageKind or GroupKind.
-	// It returns nil for any other Kind.
-	MessageType() MessageDescriptor
-
-	// EnumType is the enum type if Kind is EnumKind.
-	// It returns nil for any other Kind.
+	// EnumType has been renamed to Enum.
+	// Deprecated: Use Enum instead; this will be removed.
 	EnumType() EnumDescriptor
+	// MessageType has been renamed to Message.
+	// Deprecated: Use Message instead; this will be removed.
+	MessageType() MessageDescriptor
 
 	isFieldDescriptor
 }
@@ -387,7 +400,7 @@
 //
 // While a normal field is a member of the parent message that it is declared
 // within (see Descriptor.Parent), an extension field is a member of some other
-// target message (see ExtensionDescriptor.ExtendedType) and may have no
+// target message (see ExtensionDescriptor.Extendee) and may have no
 // relationship with the parent. However, the full name of an extension field is
 // relative to the parent that it is declared within.
 //
@@ -550,15 +563,22 @@
 type MethodDescriptor interface {
 	Descriptor
 
-	// InputType is the input message type.
-	InputType() MessageDescriptor
-	// OutputType is the output message type.
-	OutputType() MessageDescriptor
+	// Input is the input message descriptor.
+	Input() MessageDescriptor
+	// Output is the output message descriptor.
+	Output() MessageDescriptor
 	// IsStreamingClient reports whether the client streams multiple messages.
 	IsStreamingClient() bool
 	// IsStreamingServer reports whether the server streams multiple messages.
 	IsStreamingServer() bool
 
+	// InputType has been renamed to Input.
+	// Deprecated: Use Input instead; this will be removed.
+	InputType() MessageDescriptor
+	// OutputType has been renamed to Output.
+	// Deprecated: Use Output instead; this will be removed.
+	OutputType() MessageDescriptor
+
 	isMethodDescriptor
 }
 type isMethodDescriptor interface{ ProtoType(MethodDescriptor) }
diff --git a/reflect/protoregistry/registry.go b/reflect/protoregistry/registry.go
index ee91406..2f1aa62 100644
--- a/reflect/protoregistry/registry.go
+++ b/reflect/protoregistry/registry.go
@@ -372,7 +372,7 @@
 			// Check for conflicts in extensionsByMessage.
 			if xt, _ := typ.(protoreflect.ExtensionType); xt != nil {
 				field := xt.Number()
-				message := xt.ExtendedType().FullName()
+				message := xt.Extendee().FullName()
 				if r.extensionsByMessage[message][field] != nil {
 					if firstErr == nil {
 						firstErr = errors.New("extension %v is already registered on message %v", name, message)
