diff --git a/cmd/protoc-gen-go/internal_gengo/init.go b/cmd/protoc-gen-go/internal_gengo/init.go
index ffa7f00..369df13 100644
--- a/cmd/protoc-gen-go/internal_gengo/init.go
+++ b/cmd/protoc-gen-go/internal_gengo/init.go
@@ -9,7 +9,7 @@
 	"unicode/utf8"
 
 	"google.golang.org/protobuf/compiler/protogen"
-	"google.golang.org/protobuf/internal/encoding/wire"
+	"google.golang.org/protobuf/encoding/protowire"
 
 	"google.golang.org/protobuf/types/descriptorpb"
 )
@@ -146,13 +146,13 @@
 	// annotation proto from protoc-gen-go.
 	b := m.Desc.Options().(*descriptorpb.MessageOptions).ProtoReflect().GetUnknown()
 	for len(b) > 0 {
-		num, typ, n := wire.ConsumeTag(b)
+		num, typ, n := protowire.ConsumeTag(b)
 		b = b[n:]
-		if num == trackFieldUse_fieldNumber && typ == wire.VarintType {
-			v, _ := wire.ConsumeVarint(b)
-			tracked = wire.DecodeBool(v)
+		if num == trackFieldUse_fieldNumber && typ == protowire.VarintType {
+			v, _ := protowire.ConsumeVarint(b)
+			tracked = protowire.DecodeBool(v)
 		}
-		m := wire.ConsumeFieldValue(num, typ, b)
+		m := protowire.ConsumeFieldValue(num, typ, b)
 		b = b[m:]
 	}
 	return tracked
diff --git a/encoding/prototext/encode.go b/encoding/prototext/encode.go
index 7801791..83b65a6 100644
--- a/encoding/prototext/encode.go
+++ b/encoding/prototext/encode.go
@@ -10,9 +10,9 @@
 	"strconv"
 	"unicode/utf8"
 
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/internal/encoding/messageset"
 	"google.golang.org/protobuf/internal/encoding/text"
-	"google.golang.org/protobuf/internal/encoding/wire"
 	"google.golang.org/protobuf/internal/errors"
 	"google.golang.org/protobuf/internal/fieldnum"
 	"google.golang.org/protobuf/internal/flags"
@@ -336,31 +336,31 @@
 	const dec = 10
 	const hex = 16
 	for len(b) > 0 {
-		num, wtype, n := wire.ConsumeTag(b)
+		num, wtype, n := protowire.ConsumeTag(b)
 		b = b[n:]
 		e.WriteName(strconv.FormatInt(int64(num), dec))
 
 		switch wtype {
-		case wire.VarintType:
+		case protowire.VarintType:
 			var v uint64
-			v, n = wire.ConsumeVarint(b)
+			v, n = protowire.ConsumeVarint(b)
 			e.WriteUint(v)
-		case wire.Fixed32Type:
+		case protowire.Fixed32Type:
 			var v uint32
-			v, n = wire.ConsumeFixed32(b)
+			v, n = protowire.ConsumeFixed32(b)
 			e.WriteLiteral("0x" + strconv.FormatUint(uint64(v), hex))
-		case wire.Fixed64Type:
+		case protowire.Fixed64Type:
 			var v uint64
-			v, n = wire.ConsumeFixed64(b)
+			v, n = protowire.ConsumeFixed64(b)
 			e.WriteLiteral("0x" + strconv.FormatUint(v, hex))
-		case wire.BytesType:
+		case protowire.BytesType:
 			var v []byte
-			v, n = wire.ConsumeBytes(b)
+			v, n = protowire.ConsumeBytes(b)
 			e.WriteString(string(v))
-		case wire.StartGroupType:
+		case protowire.StartGroupType:
 			e.StartMessage()
 			var v []byte
-			v, n = wire.ConsumeGroup(num, b)
+			v, n = protowire.ConsumeGroup(num, b)
 			e.marshalUnknown(v)
 			e.EndMessage()
 		default:
diff --git a/internal/encoding/wire/wire.go b/encoding/protowire/wire.go
similarity index 98%
rename from internal/encoding/wire/wire.go
rename to encoding/protowire/wire.go
index e624ff8..a427f8b 100644
--- a/internal/encoding/wire/wire.go
+++ b/encoding/protowire/wire.go
@@ -2,10 +2,12 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Package wire parses and formats the protobuf wire encoding.
-//
+// Package protowire parses and formats the raw wire encoding.
 // See https://developers.google.com/protocol-buffers/docs/encoding.
-package wire
+//
+// For marshaling and unmarshaling entire protobuf messages,
+// use the "google.golang.org/protobuf/proto" package instead.
+package protowire
 
 import (
 	"io"
diff --git a/internal/encoding/wire/wire_test.go b/encoding/protowire/wire_test.go
similarity index 99%
rename from internal/encoding/wire/wire_test.go
rename to encoding/protowire/wire_test.go
index f82a526..10ec7f8 100644
--- a/internal/encoding/wire/wire_test.go
+++ b/encoding/protowire/wire_test.go
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-package wire
+package protowire
 
 import (
 	"bytes"
diff --git a/internal/cmd/generate-types/impl.go b/internal/cmd/generate-types/impl.go
index 2328de2..932c8b0 100644
--- a/internal/cmd/generate-types/impl.go
+++ b/internal/cmd/generate-types/impl.go
@@ -31,21 +31,21 @@
 */ -}}
 {{- define "Size" -}}
 {{- if .WireType.ConstSize -}}
-wire.Size{{.WireType}}()
+protowire.Size{{.WireType}}()
 {{- else if eq .WireType "Bytes" -}}
-wire.SizeBytes(len({{.FromGoType}}))
+protowire.SizeBytes(len({{.FromGoType}}))
 {{- else -}}
-wire.Size{{.WireType}}({{.FromGoType}})
+protowire.Size{{.WireType}}({{.FromGoType}})
 {{- end -}}
 {{- end -}}
 
 {{- define "SizeValue" -}}
 {{- if .WireType.ConstSize -}}
-wire.Size{{.WireType}}()
+protowire.Size{{.WireType}}()
 {{- else if eq .WireType "Bytes" -}}
-wire.SizeBytes(len({{.FromValue}}))
+protowire.SizeBytes(len({{.FromValue}}))
 {{- else -}}
-wire.Size{{.WireType}}({{.FromValue}})
+protowire.Size{{.WireType}}({{.FromValue}})
 {{- end -}}
 {{- end -}}
 
@@ -54,23 +54,23 @@
 */ -}}
 {{- define "Append" -}}
 {{- if eq .Name "String" -}}
-b = wire.AppendString(b, {{.FromGoType}})
+b = protowire.AppendString(b, {{.FromGoType}})
 {{- else -}}
-b = wire.Append{{.WireType}}(b, {{.FromGoType}})
+b = protowire.Append{{.WireType}}(b, {{.FromGoType}})
 {{- end -}}
 {{- end -}}
 
 {{- define "AppendValue" -}}
 {{- if eq .Name "String" -}}
-b = wire.AppendString(b, {{.FromValue}})
+b = protowire.AppendString(b, {{.FromValue}})
 {{- else -}}
-b = wire.Append{{.WireType}}(b, {{.FromValue}})
+b = protowire.Append{{.WireType}}(b, {{.FromValue}})
 {{- end -}}
 {{- end -}}
 
 {{- define "Consume" -}}
 {{- if eq .Name "String" -}}
-v, n := wire.ConsumeString(b)
+v, n := protowire.ConsumeString(b)
 {{- else if eq .WireType "Varint" -}}
 var v uint64
 var n int
@@ -81,10 +81,10 @@
 	v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 	n = 2
 } else {
-	v, n = wire.ConsumeVarint(b)
+	v, n = protowire.ConsumeVarint(b)
 }
 {{- else -}}
-v, n := wire.Consume{{.WireType}}(b)
+v, n := protowire.Consume{{.WireType}}(b)
 {{- end -}}
 {{- end -}}
 
@@ -102,19 +102,19 @@
 // append{{.Name}} wire encodes a {{.GoType}} pointer as a {{.Name}}.
 func append{{.Name}}(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := *p.{{.GoType.PointerMethod}}()
-	b = wire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, f.wiretag)
 	{{template "Append" .}}
 	return b, nil
 }
 
 // consume{{.Name}} wire decodes a {{.GoType}} pointer as a {{.Name}}.
-func consume{{.Name}}(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+func consume{{.Name}}(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
 	if wtyp != {{.WireType.Expr}} {
 		return out, errUnknown
 	}
 	{{template "Consume" .}}
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	*p.{{.GoType.PointerMethod}}() = {{.ToGoType}}
 	out.n = n
@@ -132,7 +132,7 @@
 // append{{.Name}}ValidateUTF8 wire encodes a {{.GoType}} pointer as a {{.Name}}.
 func append{{.Name}}ValidateUTF8(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := *p.{{.GoType.PointerMethod}}()
-	b = wire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, f.wiretag)
 	{{template "Append" .}}
 	if !utf8.Valid{{if eq .Name "String"}}String{{end}}(v) {
 		return b, errInvalidUTF8{}
@@ -141,13 +141,13 @@
 }
 
 // consume{{.Name}}ValidateUTF8 wire decodes a {{.GoType}} pointer as a {{.Name}}.
-func consume{{.Name}}ValidateUTF8(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+func consume{{.Name}}ValidateUTF8(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
 	if wtyp != {{.WireType.Expr}} {
 		return out, errUnknown
 	}
 	{{template "Consume" .}}
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	if !utf8.Valid{{if eq .Name "String"}}String{{end}}(v) {
 		return out, errInvalidUTF8{}
@@ -182,7 +182,7 @@
 	if {{template "IsZero" .}} {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, f.wiretag)
 	{{template "Append" .}}
 	return b, nil
 }
@@ -190,13 +190,13 @@
 {{if .ToGoTypeNoZero}}
 // consume{{.Name}}NoZero wire decodes a {{.GoType}} pointer as a {{.Name}}.
 // The zero value is not decoded.
-func consume{{.Name}}NoZero(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+func consume{{.Name}}NoZero(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
 	if wtyp != {{.WireType.Expr}} {
 		return out, errUnknown
 	}
 	{{template "Consume" .}}
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	*p.{{.GoType.PointerMethod}}() = {{.ToGoTypeNoZero}}
 	out.n = n
@@ -219,7 +219,7 @@
 	if {{template "IsZero" .}} {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, f.wiretag)
 	{{template "Append" .}}
 	if !utf8.Valid{{if eq .Name "String"}}String{{end}}(v) {
 		return b, errInvalidUTF8{}
@@ -229,13 +229,13 @@
 
 {{if .ToGoTypeNoZero}}
 // consume{{.Name}}NoZeroValidateUTF8 wire decodes a {{.GoType}} pointer as a {{.Name}}.
-func consume{{.Name}}NoZeroValidateUTF8(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+func consume{{.Name}}NoZeroValidateUTF8(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
 	if wtyp != {{.WireType.Expr}} {
 		return out, errUnknown
 	}
 	{{template "Consume" .}}
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	if !utf8.Valid{{if eq .Name "String"}}String{{end}}(v) {
 		return out, errInvalidUTF8{}
@@ -268,19 +268,19 @@
 // It panics if the pointer is nil.
 func append{{.Name}}Ptr(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := **p.{{.GoType.PointerMethod}}Ptr()
-	b = wire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, f.wiretag)
 	{{template "Append" .}}
 	return b, nil
 }
 
 // consume{{.Name}}Ptr wire decodes a *{{.GoType}} pointer as a {{.Name}}.
-func consume{{.Name}}Ptr(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+func consume{{.Name}}Ptr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
 	if wtyp != {{.WireType.Expr}} {
 		return out, errUnknown
 	}
 	{{template "Consume" .}}
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	vp := p.{{.GoType.PointerMethod}}Ptr()
 	if *vp == nil {
@@ -316,26 +316,26 @@
 func append{{.Name}}Slice(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	s := *p.{{.GoType.PointerMethod}}Slice()
 	for _, v := range s {
-		b = wire.AppendVarint(b, f.wiretag)
+		b = protowire.AppendVarint(b, f.wiretag)
 		{{template "Append" .}}
 	}
 	return b, nil
 }
 
 // consume{{.Name}}Slice wire decodes a []{{.GoType}} pointer as a repeated {{.Name}}.
-func consume{{.Name}}Slice(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+func consume{{.Name}}Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
 	sp := p.{{.GoType.PointerMethod}}Slice()
 	{{- if .WireType.Packable}}
-	if wtyp == wire.BytesType {
+	if wtyp == protowire.BytesType {
 		s := *sp
-		b, n := wire.ConsumeBytes(b)
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return out, wire.ParseError(n)
+			return out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
 			{{template "Consume" .}}
 			if n < 0 {
-				return out, wire.ParseError(n)
+				return out, protowire.ParseError(n)
 			}
 			s = append(s, {{.ToGoType}})
 			b = b[n:]
@@ -350,7 +350,7 @@
 	}
 	{{template "Consume" .}}
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	*sp = append(*sp, {{.ToGoType}})
 	out.n = n
@@ -369,7 +369,7 @@
 func append{{.Name}}SliceValidateUTF8(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	s := *p.{{.GoType.PointerMethod}}Slice()
 	for _, v := range s {
-		b = wire.AppendVarint(b, f.wiretag)
+		b = protowire.AppendVarint(b, f.wiretag)
 		{{template "Append" .}}
 		if !utf8.Valid{{if eq .Name "String"}}String{{end}}(v) {
 			return b, errInvalidUTF8{}
@@ -379,14 +379,14 @@
 }
 
 // consume{{.Name}}SliceValidateUTF8 wire decodes a []{{.GoType}} pointer as a repeated {{.Name}}.
-func consume{{.Name}}SliceValidateUTF8(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+func consume{{.Name}}SliceValidateUTF8(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
 	sp := p.{{.GoType.PointerMethod}}Slice()
 	if wtyp != {{.WireType.Expr}} {
 		return out, errUnknown
 	}
 	{{template "Consume" .}}
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	if !utf8.Valid{{if eq .Name "String"}}String{{end}}(v) {
 		return out, errInvalidUTF8{}
@@ -419,7 +419,7 @@
 		n += {{template "Size" .}}
 	}
 	{{- end}}
-	return f.tagsize + wire.SizeBytes(n)
+	return f.tagsize + protowire.SizeBytes(n)
 }
 
 // append{{.Name}}PackedSlice encodes a []{{.GoType}} pointer as a packed repeated {{.Name}}.
@@ -428,7 +428,7 @@
 	if len(s) == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, f.wiretag)
 	{{if .WireType.ConstSize -}}
 	n := len(s) * {{template "Size" .}}
 	{{- else -}}
@@ -437,7 +437,7 @@
 		n += {{template "Size" .}}
 	}
 	{{- end}}
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, uint64(n))
 	for _, v := range s {
 		{{template "Append" .}}
 	}
@@ -462,19 +462,19 @@
 
 // append{{.Name}}Value encodes a {{.GoType}} value as a {{.Name}}.
 func append{{.Name}}Value(b []byte, v protoreflect.Value, wiretag uint64, _ marshalOptions) ([]byte, error) {
-	b = wire.AppendVarint(b, wiretag)
+	b = protowire.AppendVarint(b, wiretag)
 	{{template "AppendValue" .}}
 	return b, nil
 }
 
 // consume{{.Name}}Value decodes a {{.GoType}} value as a {{.Name}}.
-func consume{{.Name}}Value(b []byte, _ protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+func consume{{.Name}}Value(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
 	if wtyp != {{.WireType.Expr}} {
 		return protoreflect.Value{}, out, errUnknown
 	}
 	{{template "Consume" .}}
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	out.n = n
 	return {{.ToValue}}, out, nil
@@ -494,7 +494,7 @@
 {{if (eq .Name "String")}}
 // append{{.Name}}ValueValidateUTF8 encodes a {{.GoType}} value as a {{.Name}}.
 func append{{.Name}}ValueValidateUTF8(b []byte, v protoreflect.Value, wiretag uint64, _ marshalOptions) ([]byte, error) {
-	b = wire.AppendVarint(b, wiretag)
+	b = protowire.AppendVarint(b, wiretag)
 	{{template "AppendValue" .}}
 	if !utf8.ValidString({{.FromValue}}) {
 		return b, errInvalidUTF8{}
@@ -503,13 +503,13 @@
 }
 
 // consume{{.Name}}ValueValidateUTF8 decodes a {{.GoType}} value as a {{.Name}}.
-func consume{{.Name}}ValueValidateUTF8(b []byte, _ protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+func consume{{.Name}}ValueValidateUTF8(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
 	if wtyp != {{.WireType.Expr}} {
 		return protoreflect.Value{}, out, errUnknown
 	}
 	{{template "Consume" .}}
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	if !utf8.ValidString(v) {
 		return protoreflect.Value{}, out, errInvalidUTF8{}
@@ -545,25 +545,25 @@
 	list := listv.List()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendVarint(b, wiretag)
+		b = protowire.AppendVarint(b, wiretag)
 		{{template "AppendValue" .}}
 	}
 	return b, nil
 }
 
 // consume{{.Name}}SliceValue wire decodes a []{{.GoType}} value as a repeated {{.Name}}.
-func consume{{.Name}}SliceValue(b []byte, listv protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+func consume{{.Name}}SliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
 	list := listv.List()
 	{{- if .WireType.Packable}}
-	if wtyp == wire.BytesType {
-		b, n := wire.ConsumeBytes(b)
+	if wtyp == protowire.BytesType {
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return protoreflect.Value{}, out, wire.ParseError(n)
+			return protoreflect.Value{}, out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
 			{{template "Consume" .}}
 			if n < 0 {
-				return protoreflect.Value{}, out, wire.ParseError(n)
+				return protoreflect.Value{}, out, protowire.ParseError(n)
 			}
 			list.Append({{.ToValue}})
 			b = b[n:]
@@ -577,7 +577,7 @@
 	}
 	{{template "Consume" .}}
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	list.Append({{.ToValue}})
 	out.n = n
@@ -612,7 +612,7 @@
 		n += {{template "SizeValue" .}}
 	}
 	{{- end}}
-	return tagsize + wire.SizeBytes(n)
+	return tagsize + protowire.SizeBytes(n)
 }
 
 // append{{.Name}}PackedSliceValue encodes a []{{.GoType}} value as a packed repeated {{.Name}}.
@@ -622,7 +622,7 @@
 	if llen == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, wiretag)
+	b = protowire.AppendVarint(b, wiretag)
 	{{if .WireType.ConstSize -}}
 	n := llen * {{template "SizeValue" .}}
 	{{- else -}}
@@ -632,7 +632,7 @@
 		n += {{template "SizeValue" .}}
 	}
 	{{- end}}
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, uint64(n))
 	for i := 0; i < llen; i++ {
 		v := list.Get(i)
 		{{template "AppendValue" .}}
@@ -655,7 +655,7 @@
 // We append to an empty array rather than a nil []byte to get non-nil zero-length byte slices.
 var emptyBuf [0]byte
 
-var wireTypes = map[protoreflect.Kind]wire.Type{
+var wireTypes = map[protoreflect.Kind]protowire.Type{
 {{range . -}}
 	protoreflect.{{.Name}}Kind: {{.WireType.Expr}},
 {{end}}
diff --git a/internal/cmd/generate-types/main.go b/internal/cmd/generate-types/main.go
index bf1da2b..0d3e731 100644
--- a/internal/cmd/generate-types/main.go
+++ b/internal/cmd/generate-types/main.go
@@ -190,7 +190,7 @@
 		"unicode/utf8",
 		"",
 		"google.golang.org/protobuf/internal/descfmt",
-		"google.golang.org/protobuf/internal/encoding/wire",
+		"google.golang.org/protobuf/encoding/protowire",
 		"google.golang.org/protobuf/internal/errors",
 		"google.golang.org/protobuf/internal/strs",
 		"google.golang.org/protobuf/internal/pragma",
diff --git a/internal/cmd/generate-types/proto.go b/internal/cmd/generate-types/proto.go
index 682f5f6..8ea491b 100644
--- a/internal/cmd/generate-types/proto.go
+++ b/internal/cmd/generate-types/proto.go
@@ -21,9 +21,9 @@
 
 func (w WireType) Expr() Expr {
 	if w == WireGroup {
-		return "wire.StartGroupType"
+		return "protowire.StartGroupType"
 	}
-	return "wire." + Expr(w) + "Type"
+	return "protowire." + Expr(w) + "Type"
 }
 
 func (w WireType) Packable() bool {
@@ -113,11 +113,11 @@
 	{
 		Name:       "Bool",
 		WireType:   WireVarint,
-		ToValue:    "protoreflect.ValueOfBool(wire.DecodeBool(v))",
-		FromValue:  "wire.EncodeBool(v.Bool())",
+		ToValue:    "protoreflect.ValueOfBool(protowire.DecodeBool(v))",
+		FromValue:  "protowire.EncodeBool(v.Bool())",
 		GoType:     GoBool,
-		ToGoType:   "wire.DecodeBool(v)",
-		FromGoType: "wire.EncodeBool(v)",
+		ToGoType:   "protowire.DecodeBool(v)",
+		FromGoType: "protowire.EncodeBool(v)",
 	},
 	{
 		Name:      "Enum",
@@ -137,11 +137,11 @@
 	{
 		Name:       "Sint32",
 		WireType:   WireVarint,
-		ToValue:    "protoreflect.ValueOfInt32(int32(wire.DecodeZigZag(v & math.MaxUint32)))",
-		FromValue:  "wire.EncodeZigZag(int64(int32(v.Int())))",
+		ToValue:    "protoreflect.ValueOfInt32(int32(protowire.DecodeZigZag(v & math.MaxUint32)))",
+		FromValue:  "protowire.EncodeZigZag(int64(int32(v.Int())))",
 		GoType:     GoInt32,
-		ToGoType:   "int32(wire.DecodeZigZag(v & math.MaxUint32))",
-		FromGoType: "wire.EncodeZigZag(int64(v))",
+		ToGoType:   "int32(protowire.DecodeZigZag(v & math.MaxUint32))",
+		FromGoType: "protowire.EncodeZigZag(int64(v))",
 	},
 	{
 		Name:       "Uint32",
@@ -164,11 +164,11 @@
 	{
 		Name:       "Sint64",
 		WireType:   WireVarint,
-		ToValue:    "protoreflect.ValueOfInt64(wire.DecodeZigZag(v))",
-		FromValue:  "wire.EncodeZigZag(v.Int())",
+		ToValue:    "protoreflect.ValueOfInt64(protowire.DecodeZigZag(v))",
+		FromValue:  "protowire.EncodeZigZag(v.Int())",
 		GoType:     GoInt64,
-		ToGoType:   "wire.DecodeZigZag(v)",
-		FromGoType: "wire.EncodeZigZag(v)",
+		ToGoType:   "protowire.DecodeZigZag(v)",
+		FromGoType: "protowire.EncodeZigZag(v)",
 	},
 	{
 		Name:       "Uint64",
@@ -277,7 +277,7 @@
 // unmarshalScalar decodes a value of the given kind.
 //
 // Message values are decoded into a []byte which aliases the input data.
-func (o UnmarshalOptions) unmarshalScalar(b []byte, wtyp wire.Type, fd protoreflect.FieldDescriptor) (val protoreflect.Value, n int, err error) {
+func (o UnmarshalOptions) unmarshalScalar(b []byte, wtyp protowire.Type, fd protoreflect.FieldDescriptor) (val protoreflect.Value, n int, err error) {
 	switch fd.Kind() {
 	{{- range .}}
 	case {{.Expr}}:
@@ -285,12 +285,12 @@
 			return val, 0, errUnknown
 		}
 		{{if (eq .WireType "Group") -}}
-		v, n := wire.ConsumeGroup(fd.Number(), b)
+		v, n := protowire.ConsumeGroup(fd.Number(), b)
 		{{- else -}}
-		v, n := wire.Consume{{.WireType}}(b)
+		v, n := protowire.Consume{{.WireType}}(b)
 		{{- end}}
 		if n < 0 {
-			return val, 0, wire.ParseError(n)
+			return val, 0, protowire.ParseError(n)
 		}
 		{{if (eq .Name "String") -}}
 		if strs.EnforceUTF8(fd) && !utf8.Valid(v) {
@@ -304,20 +304,20 @@
 	}
 }
 
-func (o UnmarshalOptions) unmarshalList(b []byte, wtyp wire.Type, list protoreflect.List, fd protoreflect.FieldDescriptor) (n int, err error) {
+func (o UnmarshalOptions) unmarshalList(b []byte, wtyp protowire.Type, list protoreflect.List, fd protoreflect.FieldDescriptor) (n int, err error) {
 	switch fd.Kind() {
 	{{- range .}}
 	case {{.Expr}}:
 		{{- if .WireType.Packable}}
-		if wtyp == wire.BytesType {
-			buf, n := wire.ConsumeBytes(b)
+		if wtyp == protowire.BytesType {
+			buf, n := protowire.ConsumeBytes(b)
 			if n < 0 {
-				return 0, wire.ParseError(n)
+				return 0, protowire.ParseError(n)
 			}
 			for len(buf) > 0 {
-				v, n := wire.Consume{{.WireType}}(buf)
+				v, n := protowire.Consume{{.WireType}}(buf)
 				if n < 0 {
-					return 0, wire.ParseError(n)
+					return 0, protowire.ParseError(n)
 				}
 				buf = buf[n:]
 				list.Append({{.ToValue}})
@@ -329,12 +329,12 @@
 			return 0, errUnknown
 		}
 		{{if (eq .WireType "Group") -}}
-		v, n := wire.ConsumeGroup(fd.Number(), b)
+		v, n := protowire.ConsumeGroup(fd.Number(), b)
 		{{- else -}}
-		v, n := wire.Consume{{.WireType}}(b)
+		v, n := protowire.Consume{{.WireType}}(b)
 		{{- end}}
 		if n < 0 {
-			return 0, wire.ParseError(n)
+			return 0, protowire.ParseError(n)
 		}
 		{{if (eq .Name "String") -}}
 		if strs.EnforceUTF8(fd) && !utf8.Valid(v) {
@@ -366,7 +366,7 @@
 }
 
 var protoEncodeTemplate = template.Must(template.New("").Parse(`
-var wireTypes = map[protoreflect.Kind]wire.Type{
+var wireTypes = map[protoreflect.Kind]protowire.Type{
 {{- range .}}
 	{{.Expr}}: {{.WireType.Expr}},
 {{- end}}
@@ -380,7 +380,7 @@
 		if strs.EnforceUTF8(fd) && !utf8.ValidString(v.String()) {
 			return b, errors.InvalidUTF8(string(fd.FullName()))
 		}
-		b = wire.AppendString(b, {{.FromValue}})
+		b = protowire.AppendString(b, {{.FromValue}})
 		{{- else if (eq .Name "Message") -}}
 		var pos int
 		var err error
@@ -396,9 +396,9 @@
 		if err != nil {
 			return b, err
 		}
-		b = wire.AppendVarint(b, wire.EncodeTag(fd.Number(), wire.EndGroupType))
+		b = protowire.AppendVarint(b, protowire.EncodeTag(fd.Number(), protowire.EndGroupType))
 		{{- else -}}
-		b = wire.Append{{.WireType}}(b, {{.FromValue}})
+		b = protowire.Append{{.WireType}}(b, {{.FromValue}})
 		{{- end}}
 	{{- end}}
 	default:
@@ -413,20 +413,20 @@
 }
 
 var protoSizeTemplate = template.Must(template.New("").Parse(`
-func sizeSingular(num wire.Number, kind protoreflect.Kind, v protoreflect.Value) int {
+func sizeSingular(num protowire.Number, kind protoreflect.Kind, v protoreflect.Value) int {
 	switch kind {
 	{{- range .}}
 	case {{.Expr}}:
 		{{if (eq .Name "Message") -}}
-		return wire.SizeBytes(sizeMessage(v.Message()))
+		return protowire.SizeBytes(sizeMessage(v.Message()))
 		{{- else if or (eq .WireType "Fixed32") (eq .WireType "Fixed64") -}}
-		return wire.Size{{.WireType}}()
+		return protowire.Size{{.WireType}}()
 		{{- else if (eq .WireType "Bytes") -}}
-		return wire.Size{{.WireType}}(len({{.FromValue}}))
+		return protowire.Size{{.WireType}}(len({{.FromValue}}))
 		{{- else if (eq .WireType "Group") -}}
-		return wire.Size{{.WireType}}(num, sizeMessage(v.Message()))
+		return protowire.Size{{.WireType}}(num, sizeMessage(v.Message()))
 		{{- else -}}
-		return wire.Size{{.WireType}}({{.FromValue}})
+		return protowire.Size{{.WireType}}({{.FromValue}})
 		{{- end}}
 	{{- end}}
 	default:
diff --git a/internal/cmd/pbdump/pbdump.go b/internal/cmd/pbdump/pbdump.go
index 62e3a27..456fdb6 100644
--- a/internal/cmd/pbdump/pbdump.go
+++ b/internal/cmd/pbdump/pbdump.go
@@ -17,8 +17,8 @@
 	"strconv"
 	"strings"
 
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/internal/encoding/pack"
-	"google.golang.org/protobuf/internal/encoding/wire"
 	"google.golang.org/protobuf/internal/errors"
 	"google.golang.org/protobuf/proto"
 	"google.golang.org/protobuf/reflect/protodesc"
@@ -142,7 +142,7 @@
 
 // fields is a tree of fields, keyed by a field number.
 // Fields representing messages or groups have sub-fields.
-type fields map[wire.Number]*field
+type fields map[protowire.Number]*field
 type field struct {
 	kind protoreflect.Kind
 	sub  fields // only for MessageKind or GroupKind
@@ -173,8 +173,8 @@
 	}
 	prefix = strings.TrimPrefix(prefix+"."+s[:i], ".")
 	n, _ := strconv.ParseInt(s[:i], 10, 32)
-	num := wire.Number(n)
-	if num < wire.MinValidNumber || wire.MaxValidNumber < num {
+	num := protowire.Number(n)
+	if num < protowire.MinValidNumber || protowire.MaxValidNumber < num {
 		return errors.New("invalid field: %v", prefix)
 	}
 	s = strings.TrimPrefix(s[i:], ".")
@@ -244,7 +244,7 @@
 	return m
 }
 
-func (fs fields) sortedNums() (ns []wire.Number) {
+func (fs fields) sortedNums() (ns []protowire.Number) {
 	for n := range fs {
 		ns = append(ns, n)
 	}
diff --git a/internal/encoding/messageset/messageset.go b/internal/encoding/messageset/messageset.go
index 67c6173..b1eeea5 100644
--- a/internal/encoding/messageset/messageset.go
+++ b/internal/encoding/messageset/messageset.go
@@ -8,7 +8,7 @@
 import (
 	"math"
 
-	"google.golang.org/protobuf/internal/encoding/wire"
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/internal/errors"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
 	preg "google.golang.org/protobuf/reflect/protoregistry"
@@ -26,9 +26,9 @@
 //		}
 //	}
 const (
-	FieldItem    = wire.Number(1)
-	FieldTypeID  = wire.Number(2)
-	FieldMessage = wire.Number(3)
+	FieldItem    = protowire.Number(1)
+	FieldTypeID  = protowire.Number(2)
+	FieldMessage = protowire.Number(3)
 )
 
 // ExtensionName is the field name for extensions of MessageSet.
@@ -79,8 +79,8 @@
 
 // SizeField returns the size of a MessageSet item field containing an extension
 // with the given field number, not counting the contents of the message subfield.
-func SizeField(num wire.Number) int {
-	return 2*wire.SizeTag(FieldItem) + wire.SizeTag(FieldTypeID) + wire.SizeVarint(uint64(num))
+func SizeField(num protowire.Number) int {
+	return 2*protowire.SizeTag(FieldItem) + protowire.SizeTag(FieldTypeID) + protowire.SizeVarint(uint64(num))
 }
 
 // Unmarshal parses a MessageSet.
@@ -90,17 +90,17 @@
 //
 // If wantLen is true, the item values include the varint length prefix.
 // This is ugly, but simplifies the fast-path decoder in internal/impl.
-func Unmarshal(b []byte, wantLen bool, fn func(typeID wire.Number, value []byte) error) error {
+func Unmarshal(b []byte, wantLen bool, fn func(typeID protowire.Number, value []byte) error) error {
 	for len(b) > 0 {
-		num, wtyp, n := wire.ConsumeTag(b)
+		num, wtyp, n := protowire.ConsumeTag(b)
 		if n < 0 {
-			return wire.ParseError(n)
+			return protowire.ParseError(n)
 		}
 		b = b[n:]
-		if num != FieldItem || wtyp != wire.StartGroupType {
-			n := wire.ConsumeFieldValue(num, wtyp, b)
+		if num != FieldItem || wtyp != protowire.StartGroupType {
+			n := protowire.ConsumeFieldValue(num, wtyp, b)
 			if n < 0 {
-				return wire.ParseError(n)
+				return protowire.ParseError(n)
 			}
 			b = b[n:]
 			continue
@@ -126,36 +126,36 @@
 // item length.
 //
 // If wantLen is true, the returned message value includes the length prefix.
-func ConsumeFieldValue(b []byte, wantLen bool) (typeid wire.Number, message []byte, n int, err error) {
+func ConsumeFieldValue(b []byte, wantLen bool) (typeid protowire.Number, message []byte, n int, err error) {
 	ilen := len(b)
 	for {
-		num, wtyp, n := wire.ConsumeTag(b)
+		num, wtyp, n := protowire.ConsumeTag(b)
 		if n < 0 {
-			return 0, nil, 0, wire.ParseError(n)
+			return 0, nil, 0, protowire.ParseError(n)
 		}
 		b = b[n:]
 		switch {
-		case num == FieldItem && wtyp == wire.EndGroupType:
+		case num == FieldItem && wtyp == protowire.EndGroupType:
 			if wantLen && len(message) == 0 {
 				// The message field was missing, which should never happen.
 				// Be prepared for this case anyway.
-				message = wire.AppendVarint(message, 0)
+				message = protowire.AppendVarint(message, 0)
 			}
 			return typeid, message, ilen - len(b), nil
-		case num == FieldTypeID && wtyp == wire.VarintType:
-			v, n := wire.ConsumeVarint(b)
+		case num == FieldTypeID && wtyp == protowire.VarintType:
+			v, n := protowire.ConsumeVarint(b)
 			if n < 0 {
-				return 0, nil, 0, wire.ParseError(n)
+				return 0, nil, 0, protowire.ParseError(n)
 			}
 			b = b[n:]
 			if v < 1 || v > math.MaxInt32 {
 				return 0, nil, 0, errors.New("invalid type_id in message set")
 			}
-			typeid = wire.Number(v)
-		case num == FieldMessage && wtyp == wire.BytesType:
-			m, n := wire.ConsumeBytes(b)
+			typeid = protowire.Number(v)
+		case num == FieldMessage && wtyp == protowire.BytesType:
+			m, n := protowire.ConsumeBytes(b)
 			if n < 0 {
-				return 0, nil, 0, wire.ParseError(n)
+				return 0, nil, 0, protowire.ParseError(n)
 			}
 			if message == nil {
 				if wantLen {
@@ -172,10 +172,10 @@
 				// quite inefficient since we need to strip the length off
 				// the existing data and reconstruct it with the combined length.
 				if wantLen {
-					_, nn := wire.ConsumeVarint(message)
+					_, nn := protowire.ConsumeVarint(message)
 					m0 := message[nn:]
 					message = nil
-					message = wire.AppendVarint(message, uint64(len(m0)+len(m)))
+					message = protowire.AppendVarint(message, uint64(len(m0)+len(m)))
 					message = append(message, m0...)
 					message = append(message, m...)
 				} else {
@@ -185,9 +185,9 @@
 			b = b[n:]
 		default:
 			// We have no place to put it, so we just ignore unknown fields.
-			n := wire.ConsumeFieldValue(num, wtyp, b)
+			n := protowire.ConsumeFieldValue(num, wtyp, b)
 			if n < 0 {
-				return 0, nil, 0, wire.ParseError(n)
+				return 0, nil, 0, protowire.ParseError(n)
 			}
 			b = b[n:]
 		}
@@ -197,16 +197,16 @@
 // AppendFieldStart appends the start of a MessageSet item field containing
 // an extension with the given number. The caller must add the message
 // subfield (including the tag).
-func AppendFieldStart(b []byte, num wire.Number) []byte {
-	b = wire.AppendTag(b, FieldItem, wire.StartGroupType)
-	b = wire.AppendTag(b, FieldTypeID, wire.VarintType)
-	b = wire.AppendVarint(b, uint64(num))
+func AppendFieldStart(b []byte, num protowire.Number) []byte {
+	b = protowire.AppendTag(b, FieldItem, protowire.StartGroupType)
+	b = protowire.AppendTag(b, FieldTypeID, protowire.VarintType)
+	b = protowire.AppendVarint(b, uint64(num))
 	return b
 }
 
 // AppendFieldEnd appends the trailing end group marker for a MessageSet item field.
 func AppendFieldEnd(b []byte) []byte {
-	return wire.AppendTag(b, FieldItem, wire.EndGroupType)
+	return protowire.AppendTag(b, FieldItem, protowire.EndGroupType)
 }
 
 // SizeUnknown returns the size of an unknown fields section in MessageSet format.
@@ -214,17 +214,17 @@
 // See AppendUnknown.
 func SizeUnknown(unknown []byte) (size int) {
 	for len(unknown) > 0 {
-		num, typ, n := wire.ConsumeTag(unknown)
-		if n < 0 || typ != wire.BytesType {
+		num, typ, n := protowire.ConsumeTag(unknown)
+		if n < 0 || typ != protowire.BytesType {
 			return 0
 		}
 		unknown = unknown[n:]
-		_, n = wire.ConsumeBytes(unknown)
+		_, n = protowire.ConsumeBytes(unknown)
 		if n < 0 {
 			return 0
 		}
 		unknown = unknown[n:]
-		size += SizeField(num) + wire.SizeTag(FieldMessage) + n
+		size += SizeField(num) + protowire.SizeTag(FieldMessage) + n
 	}
 	return size
 }
@@ -239,17 +239,17 @@
 // This function converts the unknown fields back into MessageSet form.
 func AppendUnknown(b, unknown []byte) ([]byte, error) {
 	for len(unknown) > 0 {
-		num, typ, n := wire.ConsumeTag(unknown)
-		if n < 0 || typ != wire.BytesType {
+		num, typ, n := protowire.ConsumeTag(unknown)
+		if n < 0 || typ != protowire.BytesType {
 			return nil, errors.New("invalid data in message set unknown fields")
 		}
 		unknown = unknown[n:]
-		_, n = wire.ConsumeBytes(unknown)
+		_, n = protowire.ConsumeBytes(unknown)
 		if n < 0 {
 			return nil, errors.New("invalid data in message set unknown fields")
 		}
 		b = AppendFieldStart(b, num)
-		b = wire.AppendTag(b, FieldMessage, wire.BytesType)
+		b = protowire.AppendTag(b, FieldMessage, protowire.BytesType)
 		b = append(b, unknown[:n]...)
 		b = AppendFieldEnd(b)
 		unknown = unknown[n:]
diff --git a/internal/encoding/pack/pack.go b/internal/encoding/pack/pack.go
index 4e172e6..163002f 100644
--- a/internal/encoding/pack/pack.go
+++ b/internal/encoding/pack/pack.go
@@ -21,32 +21,32 @@
 	"unicode"
 	"unicode/utf8"
 
-	"google.golang.org/protobuf/internal/encoding/wire"
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/reflect/protoreflect"
 )
 
 // Number is the field number; aliased from the wire package for convenience.
-type Number = wire.Number
+type Number = protowire.Number
 
 // Number type constants; copied from the wire package for convenience.
 const (
-	MinValidNumber      Number = wire.MinValidNumber
-	FirstReservedNumber Number = wire.FirstReservedNumber
-	LastReservedNumber  Number = wire.LastReservedNumber
-	MaxValidNumber      Number = wire.MaxValidNumber
+	MinValidNumber      Number = protowire.MinValidNumber
+	FirstReservedNumber Number = protowire.FirstReservedNumber
+	LastReservedNumber  Number = protowire.LastReservedNumber
+	MaxValidNumber      Number = protowire.MaxValidNumber
 )
 
 // Type is the wire type; aliased from the wire package for convenience.
-type Type = wire.Type
+type Type = protowire.Type
 
 // Wire type constants; copied from the wire package for convenience.
 const (
-	VarintType     Type = wire.VarintType
-	Fixed32Type    Type = wire.Fixed32Type
-	Fixed64Type    Type = wire.Fixed64Type
-	BytesType      Type = wire.BytesType
-	StartGroupType Type = wire.StartGroupType
-	EndGroupType   Type = wire.EndGroupType
+	VarintType     Type = protowire.VarintType
+	Fixed32Type    Type = protowire.Fixed32Type
+	Fixed64Type    Type = protowire.Fixed64Type
+	BytesType      Type = protowire.BytesType
+	StartGroupType Type = protowire.StartGroupType
+	EndGroupType   Type = protowire.EndGroupType
 )
 
 type (
@@ -140,25 +140,25 @@
 		case Message:
 			n += v.Size()
 		case Tag:
-			n += wire.SizeTag(v.Number)
+			n += protowire.SizeTag(v.Number)
 		case Bool:
-			n += wire.SizeVarint(wire.EncodeBool(false))
+			n += protowire.SizeVarint(protowire.EncodeBool(false))
 		case Varint:
-			n += wire.SizeVarint(uint64(v))
+			n += protowire.SizeVarint(uint64(v))
 		case Svarint:
-			n += wire.SizeVarint(wire.EncodeZigZag(int64(v)))
+			n += protowire.SizeVarint(protowire.EncodeZigZag(int64(v)))
 		case Uvarint:
-			n += wire.SizeVarint(uint64(v))
+			n += protowire.SizeVarint(uint64(v))
 		case Int32, Uint32, Float32:
-			n += wire.SizeFixed32()
+			n += protowire.SizeFixed32()
 		case Int64, Uint64, Float64:
-			n += wire.SizeFixed64()
+			n += protowire.SizeFixed64()
 		case String:
-			n += wire.SizeBytes(len(v))
+			n += protowire.SizeBytes(len(v))
 		case Bytes:
-			n += wire.SizeBytes(len(v))
+			n += protowire.SizeBytes(len(v))
 		case LengthPrefix:
-			n += wire.SizeBytes(Message(v).Size())
+			n += protowire.SizeBytes(Message(v).Size())
 		case Denormalized:
 			n += int(v.Count) + Message{v.Value}.Size()
 		case Raw:
@@ -199,36 +199,36 @@
 		case Message:
 			out = append(out, v.Marshal()...)
 		case Tag:
-			out = wire.AppendTag(out, v.Number, v.Type)
+			out = protowire.AppendTag(out, v.Number, v.Type)
 		case Bool:
-			out = wire.AppendVarint(out, wire.EncodeBool(bool(v)))
+			out = protowire.AppendVarint(out, protowire.EncodeBool(bool(v)))
 		case Varint:
-			out = wire.AppendVarint(out, uint64(v))
+			out = protowire.AppendVarint(out, uint64(v))
 		case Svarint:
-			out = wire.AppendVarint(out, wire.EncodeZigZag(int64(v)))
+			out = protowire.AppendVarint(out, protowire.EncodeZigZag(int64(v)))
 		case Uvarint:
-			out = wire.AppendVarint(out, uint64(v))
+			out = protowire.AppendVarint(out, uint64(v))
 		case Int32:
-			out = wire.AppendFixed32(out, uint32(v))
+			out = protowire.AppendFixed32(out, uint32(v))
 		case Uint32:
-			out = wire.AppendFixed32(out, uint32(v))
+			out = protowire.AppendFixed32(out, uint32(v))
 		case Float32:
-			out = wire.AppendFixed32(out, math.Float32bits(float32(v)))
+			out = protowire.AppendFixed32(out, math.Float32bits(float32(v)))
 		case Int64:
-			out = wire.AppendFixed64(out, uint64(v))
+			out = protowire.AppendFixed64(out, uint64(v))
 		case Uint64:
-			out = wire.AppendFixed64(out, uint64(v))
+			out = protowire.AppendFixed64(out, uint64(v))
 		case Float64:
-			out = wire.AppendFixed64(out, math.Float64bits(float64(v)))
+			out = protowire.AppendFixed64(out, math.Float64bits(float64(v)))
 		case String:
-			out = wire.AppendBytes(out, []byte(v))
+			out = protowire.AppendBytes(out, []byte(v))
 		case Bytes:
-			out = wire.AppendBytes(out, []byte(v))
+			out = protowire.AppendBytes(out, []byte(v))
 		case LengthPrefix:
-			out = wire.AppendBytes(out, Message(v).Marshal())
+			out = protowire.AppendBytes(out, Message(v).Marshal())
 		case Denormalized:
 			b := Message{v.Value}.Marshal()
-			_, n := wire.ConsumeVarint(b)
+			_, n := protowire.ConsumeVarint(b)
 			out = append(out, b[:n]...)
 			for i := uint(0); i < v.Count; i++ {
 				out[len(out)-1] |= 0x80 // set continuation bit on previous
@@ -301,8 +301,8 @@
 
 func (p *parser) parseMessage(msgDesc protoreflect.MessageDescriptor, group bool) {
 	for len(p.in) > 0 {
-		v, n := wire.ConsumeVarint(p.in)
-		num, typ := wire.DecodeTag(v)
+		v, n := protowire.ConsumeVarint(p.in)
+		num, typ := protowire.DecodeTag(v)
 		if n < 0 || num < 0 || v > math.MaxUint32 {
 			p.out, p.in = append(p.out, Raw(p.in)), nil
 			return
@@ -311,7 +311,7 @@
 			return // if inside a group, then stop
 		}
 		p.out, p.in = append(p.out, Tag{num, typ}), p.in[n:]
-		if m := n - wire.SizeVarint(v); m > 0 {
+		if m := n - protowire.SizeVarint(v); m > 0 {
 			p.out[len(p.out)-1] = Denormalized{uint(m), p.out[len(p.out)-1]}
 		}
 
@@ -353,7 +353,7 @@
 }
 
 func (p *parser) parseVarint(kind protoreflect.Kind) {
-	v, n := wire.ConsumeVarint(p.in)
+	v, n := protowire.ConsumeVarint(p.in)
 	if n < 0 {
 		p.out, p.in = append(p.out, Raw(p.in)), nil
 		return
@@ -371,17 +371,17 @@
 	case protoreflect.Int32Kind, protoreflect.Int64Kind:
 		p.out, p.in = append(p.out, Varint(v)), p.in[n:]
 	case protoreflect.Sint32Kind, protoreflect.Sint64Kind:
-		p.out, p.in = append(p.out, Svarint(wire.DecodeZigZag(v))), p.in[n:]
+		p.out, p.in = append(p.out, Svarint(protowire.DecodeZigZag(v))), p.in[n:]
 	default:
 		p.out, p.in = append(p.out, Uvarint(v)), p.in[n:]
 	}
-	if m := n - wire.SizeVarint(v); m > 0 {
+	if m := n - protowire.SizeVarint(v); m > 0 {
 		p.out[len(p.out)-1] = Denormalized{uint(m), p.out[len(p.out)-1]}
 	}
 }
 
 func (p *parser) parseFixed32(kind protoreflect.Kind) {
-	v, n := wire.ConsumeFixed32(p.in)
+	v, n := protowire.ConsumeFixed32(p.in)
 	if n < 0 {
 		p.out, p.in = append(p.out, Raw(p.in)), nil
 		return
@@ -397,7 +397,7 @@
 }
 
 func (p *parser) parseFixed64(kind protoreflect.Kind) {
-	v, n := wire.ConsumeFixed64(p.in)
+	v, n := protowire.ConsumeFixed64(p.in)
 	if n < 0 {
 		p.out, p.in = append(p.out, Raw(p.in)), nil
 		return
@@ -413,13 +413,13 @@
 }
 
 func (p *parser) parseBytes(isPacked bool, kind protoreflect.Kind, desc protoreflect.MessageDescriptor) {
-	v, n := wire.ConsumeVarint(p.in)
+	v, n := protowire.ConsumeVarint(p.in)
 	if n < 0 {
 		p.out, p.in = append(p.out, Raw(p.in)), nil
 		return
 	}
 	p.out, p.in = append(p.out, Uvarint(v)), p.in[n:]
-	if m := n - wire.SizeVarint(v); m > 0 {
+	if m := n - protowire.SizeVarint(v); m > 0 {
 		p.out[len(p.out)-1] = Denormalized{uint(m), p.out[len(p.out)-1]}
 	}
 	if v > uint64(len(p.in)) {
@@ -442,7 +442,7 @@
 			p.out, p.in = append(p.out, Bytes(p.in[:v])), p.in[v:]
 		}
 	}
-	if m := n - wire.SizeVarint(v); m > 0 {
+	if m := n - protowire.SizeVarint(v); m > 0 {
 		p.out[len(p.out)-1] = Denormalized{uint(m), p.out[len(p.out)-1]}
 	}
 }
@@ -475,10 +475,10 @@
 	p.in = p2.in
 
 	// Append the trailing end group.
-	v, n := wire.ConsumeVarint(p.in)
-	if num, typ := wire.DecodeTag(v); typ == EndGroupType {
+	v, n := protowire.ConsumeVarint(p.in)
+	if num, typ := protowire.DecodeTag(v); typ == EndGroupType {
 		p.out, p.in = append(p.out, Tag{num, typ}), p.in[n:]
-		if m := n - wire.SizeVarint(v); m > 0 {
+		if m := n - protowire.SizeVarint(v); m > 0 {
 			p.out[len(p.out)-1] = Denormalized{uint(m), p.out[len(p.out)-1]}
 		}
 	}
diff --git a/internal/filedesc/build.go b/internal/filedesc/build.go
index f4af7ad..462d384 100644
--- a/internal/filedesc/build.go
+++ b/internal/filedesc/build.go
@@ -6,7 +6,7 @@
 package filedesc
 
 import (
-	"google.golang.org/protobuf/internal/encoding/wire"
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/internal/fieldnum"
 	"google.golang.org/protobuf/reflect/protoreflect"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
@@ -118,11 +118,11 @@
 // or a MessageDescriptorProto depending on whether isFile is set.
 func (db *Builder) unmarshalCounts(b []byte, isFile bool) {
 	for len(b) > 0 {
-		num, typ, n := wire.ConsumeTag(b)
+		num, typ, n := protowire.ConsumeTag(b)
 		b = b[n:]
 		switch typ {
-		case wire.BytesType:
-			v, m := wire.ConsumeBytes(b)
+		case protowire.BytesType:
+			v, m := protowire.ConsumeBytes(b)
 			b = b[m:]
 			if isFile {
 				switch num {
@@ -148,7 +148,7 @@
 				}
 			}
 		default:
-			m := wire.ConsumeFieldValue(num, typ, b)
+			m := protowire.ConsumeFieldValue(num, typ, b)
 			b = b[m:]
 		}
 	}
diff --git a/internal/filedesc/desc_init.go b/internal/filedesc/desc_init.go
index 249021f..c0cddf8 100644
--- a/internal/filedesc/desc_init.go
+++ b/internal/filedesc/desc_init.go
@@ -7,7 +7,7 @@
 import (
 	"sync"
 
-	"google.golang.org/protobuf/internal/encoding/wire"
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/internal/fieldnum"
 	"google.golang.org/protobuf/internal/strs"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
@@ -100,11 +100,11 @@
 	var posEnums, posMessages, posExtensions, posServices int
 	b0 := b
 	for len(b) > 0 {
-		num, typ, n := wire.ConsumeTag(b)
+		num, typ, n := protowire.ConsumeTag(b)
 		b = b[n:]
 		switch typ {
-		case wire.BytesType:
-			v, m := wire.ConsumeBytes(b)
+		case protowire.BytesType:
+			v, m := protowire.ConsumeBytes(b)
 			b = b[m:]
 			switch num {
 			case fieldnum.FileDescriptorProto_Syntax:
@@ -155,7 +155,7 @@
 			}
 			prevField = num
 		default:
-			m := wire.ConsumeFieldValue(num, typ, b)
+			m := protowire.ConsumeFieldValue(num, typ, b)
 			b = b[m:]
 			prevField = -1 // ignore known field numbers of unknown wire type
 		}
@@ -184,8 +184,8 @@
 	if numEnums > 0 {
 		b := b0[posEnums:]
 		for i := range fd.L1.Enums.List {
-			_, n := wire.ConsumeVarint(b)
-			v, m := wire.ConsumeBytes(b[n:])
+			_, n := protowire.ConsumeVarint(b)
+			v, m := protowire.ConsumeBytes(b[n:])
 			fd.L1.Enums.List[i].unmarshalSeed(v, sb, fd, fd, i)
 			b = b[n+m:]
 		}
@@ -193,8 +193,8 @@
 	if numMessages > 0 {
 		b := b0[posMessages:]
 		for i := range fd.L1.Messages.List {
-			_, n := wire.ConsumeVarint(b)
-			v, m := wire.ConsumeBytes(b[n:])
+			_, n := protowire.ConsumeVarint(b)
+			v, m := protowire.ConsumeBytes(b[n:])
 			fd.L1.Messages.List[i].unmarshalSeed(v, sb, fd, fd, i)
 			b = b[n+m:]
 		}
@@ -202,8 +202,8 @@
 	if numExtensions > 0 {
 		b := b0[posExtensions:]
 		for i := range fd.L1.Extensions.List {
-			_, n := wire.ConsumeVarint(b)
-			v, m := wire.ConsumeBytes(b[n:])
+			_, n := protowire.ConsumeVarint(b)
+			v, m := protowire.ConsumeBytes(b[n:])
 			fd.L1.Extensions.List[i].unmarshalSeed(v, sb, fd, fd, i)
 			b = b[n+m:]
 		}
@@ -211,8 +211,8 @@
 	if numServices > 0 {
 		b := b0[posServices:]
 		for i := range fd.L1.Services.List {
-			_, n := wire.ConsumeVarint(b)
-			v, m := wire.ConsumeBytes(b[n:])
+			_, n := protowire.ConsumeVarint(b)
+			v, m := protowire.ConsumeBytes(b[n:])
 			fd.L1.Services.List[i].unmarshalSeed(v, sb, fd, fd, i)
 			b = b[n+m:]
 		}
@@ -226,11 +226,11 @@
 
 	var numValues int
 	for b := b; len(b) > 0; {
-		num, typ, n := wire.ConsumeTag(b)
+		num, typ, n := protowire.ConsumeTag(b)
 		b = b[n:]
 		switch typ {
-		case wire.BytesType:
-			v, m := wire.ConsumeBytes(b)
+		case protowire.BytesType:
+			v, m := protowire.ConsumeBytes(b)
 			b = b[m:]
 			switch num {
 			case fieldnum.EnumDescriptorProto_Name:
@@ -239,7 +239,7 @@
 				numValues++
 			}
 		default:
-			m := wire.ConsumeFieldValue(num, typ, b)
+			m := protowire.ConsumeFieldValue(num, typ, b)
 			b = b[m:]
 		}
 	}
@@ -253,11 +253,11 @@
 	ed.L2 = new(EnumL2)
 	ed.L2.Values.List = make([]EnumValue, numValues)
 	for i := 0; len(b) > 0; {
-		num, typ, n := wire.ConsumeTag(b)
+		num, typ, n := protowire.ConsumeTag(b)
 		b = b[n:]
 		switch typ {
-		case wire.BytesType:
-			v, m := wire.ConsumeBytes(b)
+		case protowire.BytesType:
+			v, m := protowire.ConsumeBytes(b)
 			b = b[m:]
 			switch num {
 			case fieldnum.EnumDescriptorProto_Value:
@@ -265,7 +265,7 @@
 				i++
 			}
 		default:
-			m := wire.ConsumeFieldValue(num, typ, b)
+			m := protowire.ConsumeFieldValue(num, typ, b)
 			b = b[m:]
 		}
 	}
@@ -281,11 +281,11 @@
 	var posEnums, posMessages, posExtensions int
 	b0 := b
 	for len(b) > 0 {
-		num, typ, n := wire.ConsumeTag(b)
+		num, typ, n := protowire.ConsumeTag(b)
 		b = b[n:]
 		switch typ {
-		case wire.BytesType:
-			v, m := wire.ConsumeBytes(b)
+		case protowire.BytesType:
+			v, m := protowire.ConsumeBytes(b)
 			b = b[m:]
 			switch num {
 			case fieldnum.DescriptorProto_Name:
@@ -319,7 +319,7 @@
 			}
 			prevField = num
 		default:
-			m := wire.ConsumeFieldValue(num, typ, b)
+			m := protowire.ConsumeFieldValue(num, typ, b)
 			b = b[m:]
 			prevField = -1 // ignore known field numbers of unknown wire type
 		}
@@ -340,8 +340,8 @@
 	if numEnums > 0 {
 		b := b0[posEnums:]
 		for i := range md.L1.Enums.List {
-			_, n := wire.ConsumeVarint(b)
-			v, m := wire.ConsumeBytes(b[n:])
+			_, n := protowire.ConsumeVarint(b)
+			v, m := protowire.ConsumeBytes(b[n:])
 			md.L1.Enums.List[i].unmarshalSeed(v, sb, pf, md, i)
 			b = b[n+m:]
 		}
@@ -349,8 +349,8 @@
 	if numMessages > 0 {
 		b := b0[posMessages:]
 		for i := range md.L1.Messages.List {
-			_, n := wire.ConsumeVarint(b)
-			v, m := wire.ConsumeBytes(b[n:])
+			_, n := protowire.ConsumeVarint(b)
+			v, m := protowire.ConsumeBytes(b[n:])
 			md.L1.Messages.List[i].unmarshalSeed(v, sb, pf, md, i)
 			b = b[n+m:]
 		}
@@ -358,8 +358,8 @@
 	if numExtensions > 0 {
 		b := b0[posExtensions:]
 		for i := range md.L1.Extensions.List {
-			_, n := wire.ConsumeVarint(b)
-			v, m := wire.ConsumeBytes(b[n:])
+			_, n := protowire.ConsumeVarint(b)
+			v, m := protowire.ConsumeBytes(b[n:])
 			md.L1.Extensions.List[i].unmarshalSeed(v, sb, pf, md, i)
 			b = b[n+m:]
 		}
@@ -368,20 +368,20 @@
 
 func (md *Message) unmarshalSeedOptions(b []byte) {
 	for len(b) > 0 {
-		num, typ, n := wire.ConsumeTag(b)
+		num, typ, n := protowire.ConsumeTag(b)
 		b = b[n:]
 		switch typ {
-		case wire.VarintType:
-			v, m := wire.ConsumeVarint(b)
+		case protowire.VarintType:
+			v, m := protowire.ConsumeVarint(b)
 			b = b[m:]
 			switch num {
 			case fieldnum.MessageOptions_MapEntry:
-				md.L1.IsMapEntry = wire.DecodeBool(v)
+				md.L1.IsMapEntry = protowire.DecodeBool(v)
 			case fieldnum.MessageOptions_MessageSetWireFormat:
-				md.L1.IsMessageSet = wire.DecodeBool(v)
+				md.L1.IsMessageSet = protowire.DecodeBool(v)
 			}
 		default:
-			m := wire.ConsumeFieldValue(num, typ, b)
+			m := protowire.ConsumeFieldValue(num, typ, b)
 			b = b[m:]
 		}
 	}
@@ -393,11 +393,11 @@
 	xd.L0.Index = i
 
 	for len(b) > 0 {
-		num, typ, n := wire.ConsumeTag(b)
+		num, typ, n := protowire.ConsumeTag(b)
 		b = b[n:]
 		switch typ {
-		case wire.VarintType:
-			v, m := wire.ConsumeVarint(b)
+		case protowire.VarintType:
+			v, m := protowire.ConsumeVarint(b)
 			b = b[m:]
 			switch num {
 			case fieldnum.FieldDescriptorProto_Number:
@@ -407,8 +407,8 @@
 			case fieldnum.FieldDescriptorProto_Type:
 				xd.L1.Kind = pref.Kind(v)
 			}
-		case wire.BytesType:
-			v, m := wire.ConsumeBytes(b)
+		case protowire.BytesType:
+			v, m := protowire.ConsumeBytes(b)
 			b = b[m:]
 			switch num {
 			case fieldnum.FieldDescriptorProto_Name:
@@ -417,7 +417,7 @@
 				xd.L1.Extendee = PlaceholderMessage(makeFullName(sb, v))
 			}
 		default:
-			m := wire.ConsumeFieldValue(num, typ, b)
+			m := protowire.ConsumeFieldValue(num, typ, b)
 			b = b[m:]
 		}
 	}
@@ -429,18 +429,18 @@
 	sd.L0.Index = i
 
 	for len(b) > 0 {
-		num, typ, n := wire.ConsumeTag(b)
+		num, typ, n := protowire.ConsumeTag(b)
 		b = b[n:]
 		switch typ {
-		case wire.BytesType:
-			v, m := wire.ConsumeBytes(b)
+		case protowire.BytesType:
+			v, m := protowire.ConsumeBytes(b)
 			b = b[m:]
 			switch num {
 			case fieldnum.ServiceDescriptorProto_Name:
 				sd.L0.FullName = appendFullName(sb, pd.FullName(), v)
 			}
 		default:
-			m := wire.ConsumeFieldValue(num, typ, b)
+			m := protowire.ConsumeFieldValue(num, typ, b)
 			b = b[m:]
 		}
 	}
diff --git a/internal/filedesc/desc_lazy.go b/internal/filedesc/desc_lazy.go
index c43b3e2..cdf3164 100644
--- a/internal/filedesc/desc_lazy.go
+++ b/internal/filedesc/desc_lazy.go
@@ -8,8 +8,8 @@
 	"reflect"
 	"sync"
 
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/internal/descopts"
-	"google.golang.org/protobuf/internal/encoding/wire"
 	"google.golang.org/protobuf/internal/fieldnum"
 	"google.golang.org/protobuf/internal/strs"
 	"google.golang.org/protobuf/proto"
@@ -136,11 +136,11 @@
 	var rawOptions []byte
 	fd.L2 = new(FileL2)
 	for len(b) > 0 {
-		num, typ, n := wire.ConsumeTag(b)
+		num, typ, n := protowire.ConsumeTag(b)
 		b = b[n:]
 		switch typ {
-		case wire.VarintType:
-			v, m := wire.ConsumeVarint(b)
+		case protowire.VarintType:
+			v, m := protowire.ConsumeVarint(b)
 			b = b[m:]
 			switch num {
 			case fieldnum.FileDescriptorProto_PublicDependency:
@@ -148,8 +148,8 @@
 			case fieldnum.FileDescriptorProto_WeakDependency:
 				fd.L2.Imports[v].IsWeak = true
 			}
-		case wire.BytesType:
-			v, m := wire.ConsumeBytes(b)
+		case protowire.BytesType:
+			v, m := protowire.ConsumeBytes(b)
 			b = b[m:]
 			switch num {
 			case fieldnum.FileDescriptorProto_Dependency:
@@ -175,7 +175,7 @@
 				rawOptions = appendOptions(rawOptions, v)
 			}
 		default:
-			m := wire.ConsumeFieldValue(num, typ, b)
+			m := protowire.ConsumeFieldValue(num, typ, b)
 			b = b[m:]
 		}
 	}
@@ -189,11 +189,11 @@
 		ed.L2 = new(EnumL2)
 	}
 	for len(b) > 0 {
-		num, typ, n := wire.ConsumeTag(b)
+		num, typ, n := protowire.ConsumeTag(b)
 		b = b[n:]
 		switch typ {
-		case wire.BytesType:
-			v, m := wire.ConsumeBytes(b)
+		case protowire.BytesType:
+			v, m := protowire.ConsumeBytes(b)
 			b = b[m:]
 			switch num {
 			case fieldnum.EnumDescriptorProto_Value:
@@ -206,7 +206,7 @@
 				rawOptions = appendOptions(rawOptions, v)
 			}
 		default:
-			m := wire.ConsumeFieldValue(num, typ, b)
+			m := protowire.ConsumeFieldValue(num, typ, b)
 			b = b[m:]
 		}
 	}
@@ -221,11 +221,11 @@
 
 func unmarshalEnumReservedRange(b []byte) (r [2]pref.EnumNumber) {
 	for len(b) > 0 {
-		num, typ, n := wire.ConsumeTag(b)
+		num, typ, n := protowire.ConsumeTag(b)
 		b = b[n:]
 		switch typ {
-		case wire.VarintType:
-			v, m := wire.ConsumeVarint(b)
+		case protowire.VarintType:
+			v, m := protowire.ConsumeVarint(b)
 			b = b[m:]
 			switch num {
 			case fieldnum.EnumDescriptorProto_EnumReservedRange_Start:
@@ -234,7 +234,7 @@
 				r[1] = pref.EnumNumber(v)
 			}
 		default:
-			m := wire.ConsumeFieldValue(num, typ, b)
+			m := protowire.ConsumeFieldValue(num, typ, b)
 			b = b[m:]
 		}
 	}
@@ -248,18 +248,18 @@
 
 	var rawOptions []byte
 	for len(b) > 0 {
-		num, typ, n := wire.ConsumeTag(b)
+		num, typ, n := protowire.ConsumeTag(b)
 		b = b[n:]
 		switch typ {
-		case wire.VarintType:
-			v, m := wire.ConsumeVarint(b)
+		case protowire.VarintType:
+			v, m := protowire.ConsumeVarint(b)
 			b = b[m:]
 			switch num {
 			case fieldnum.EnumValueDescriptorProto_Number:
 				vd.L1.Number = pref.EnumNumber(v)
 			}
-		case wire.BytesType:
-			v, m := wire.ConsumeBytes(b)
+		case protowire.BytesType:
+			v, m := protowire.ConsumeBytes(b)
 			b = b[m:]
 			switch num {
 			case fieldnum.EnumValueDescriptorProto_Name:
@@ -269,7 +269,7 @@
 				rawOptions = appendOptions(rawOptions, v)
 			}
 		default:
-			m := wire.ConsumeFieldValue(num, typ, b)
+			m := protowire.ConsumeFieldValue(num, typ, b)
 			b = b[m:]
 		}
 	}
@@ -282,11 +282,11 @@
 	var rawOptions []byte
 	md.L2 = new(MessageL2)
 	for len(b) > 0 {
-		num, typ, n := wire.ConsumeTag(b)
+		num, typ, n := protowire.ConsumeTag(b)
 		b = b[n:]
 		switch typ {
-		case wire.BytesType:
-			v, m := wire.ConsumeBytes(b)
+		case protowire.BytesType:
+			v, m := protowire.ConsumeBytes(b)
 			b = b[m:]
 			switch num {
 			case fieldnum.DescriptorProto_Field:
@@ -316,7 +316,7 @@
 				rawOptions = appendOptions(rawOptions, v)
 			}
 		default:
-			m := wire.ConsumeFieldValue(num, typ, b)
+			m := protowire.ConsumeFieldValue(num, typ, b)
 			b = b[m:]
 		}
 	}
@@ -340,20 +340,20 @@
 
 func (md *Message) unmarshalOptions(b []byte) {
 	for len(b) > 0 {
-		num, typ, n := wire.ConsumeTag(b)
+		num, typ, n := protowire.ConsumeTag(b)
 		b = b[n:]
 		switch typ {
-		case wire.VarintType:
-			v, m := wire.ConsumeVarint(b)
+		case protowire.VarintType:
+			v, m := protowire.ConsumeVarint(b)
 			b = b[m:]
 			switch num {
 			case fieldnum.MessageOptions_MapEntry:
-				md.L1.IsMapEntry = wire.DecodeBool(v)
+				md.L1.IsMapEntry = protowire.DecodeBool(v)
 			case fieldnum.MessageOptions_MessageSetWireFormat:
-				md.L1.IsMessageSet = wire.DecodeBool(v)
+				md.L1.IsMessageSet = protowire.DecodeBool(v)
 			}
 		default:
-			m := wire.ConsumeFieldValue(num, typ, b)
+			m := protowire.ConsumeFieldValue(num, typ, b)
 			b = b[m:]
 		}
 	}
@@ -361,11 +361,11 @@
 
 func unmarshalMessageReservedRange(b []byte) (r [2]pref.FieldNumber) {
 	for len(b) > 0 {
-		num, typ, n := wire.ConsumeTag(b)
+		num, typ, n := protowire.ConsumeTag(b)
 		b = b[n:]
 		switch typ {
-		case wire.VarintType:
-			v, m := wire.ConsumeVarint(b)
+		case protowire.VarintType:
+			v, m := protowire.ConsumeVarint(b)
 			b = b[m:]
 			switch num {
 			case fieldnum.DescriptorProto_ReservedRange_Start:
@@ -374,7 +374,7 @@
 				r[1] = pref.FieldNumber(v)
 			}
 		default:
-			m := wire.ConsumeFieldValue(num, typ, b)
+			m := protowire.ConsumeFieldValue(num, typ, b)
 			b = b[m:]
 		}
 	}
@@ -383,11 +383,11 @@
 
 func unmarshalMessageExtensionRange(b []byte) (r [2]pref.FieldNumber, rawOptions []byte) {
 	for len(b) > 0 {
-		num, typ, n := wire.ConsumeTag(b)
+		num, typ, n := protowire.ConsumeTag(b)
 		b = b[n:]
 		switch typ {
-		case wire.VarintType:
-			v, m := wire.ConsumeVarint(b)
+		case protowire.VarintType:
+			v, m := protowire.ConsumeVarint(b)
 			b = b[m:]
 			switch num {
 			case fieldnum.DescriptorProto_ExtensionRange_Start:
@@ -395,15 +395,15 @@
 			case fieldnum.DescriptorProto_ExtensionRange_End:
 				r[1] = pref.FieldNumber(v)
 			}
-		case wire.BytesType:
-			v, m := wire.ConsumeBytes(b)
+		case protowire.BytesType:
+			v, m := protowire.ConsumeBytes(b)
 			b = b[m:]
 			switch num {
 			case fieldnum.DescriptorProto_ExtensionRange_Options:
 				rawOptions = appendOptions(rawOptions, v)
 			}
 		default:
-			m := wire.ConsumeFieldValue(num, typ, b)
+			m := protowire.ConsumeFieldValue(num, typ, b)
 			b = b[m:]
 		}
 	}
@@ -418,11 +418,11 @@
 	var rawTypeName []byte
 	var rawOptions []byte
 	for len(b) > 0 {
-		num, typ, n := wire.ConsumeTag(b)
+		num, typ, n := protowire.ConsumeTag(b)
 		b = b[n:]
 		switch typ {
-		case wire.VarintType:
-			v, m := wire.ConsumeVarint(b)
+		case protowire.VarintType:
+			v, m := protowire.ConsumeVarint(b)
 			b = b[m:]
 			switch num {
 			case fieldnum.FieldDescriptorProto_Number:
@@ -442,8 +442,8 @@
 				}
 				fd.L1.ContainingOneof = od
 			}
-		case wire.BytesType:
-			v, m := wire.ConsumeBytes(b)
+		case protowire.BytesType:
+			v, m := protowire.ConsumeBytes(b)
 			b = b[m:]
 			switch num {
 			case fieldnum.FieldDescriptorProto_Name:
@@ -459,7 +459,7 @@
 				rawOptions = appendOptions(rawOptions, v)
 			}
 		default:
-			m := wire.ConsumeFieldValue(num, typ, b)
+			m := protowire.ConsumeFieldValue(num, typ, b)
 			b = b[m:]
 		}
 	}
@@ -479,24 +479,24 @@
 	const FieldOptions_EnforceUTF8 = 13
 
 	for len(b) > 0 {
-		num, typ, n := wire.ConsumeTag(b)
+		num, typ, n := protowire.ConsumeTag(b)
 		b = b[n:]
 		switch typ {
-		case wire.VarintType:
-			v, m := wire.ConsumeVarint(b)
+		case protowire.VarintType:
+			v, m := protowire.ConsumeVarint(b)
 			b = b[m:]
 			switch num {
 			case fieldnum.FieldOptions_Packed:
 				fd.L1.HasPacked = true
-				fd.L1.IsPacked = wire.DecodeBool(v)
+				fd.L1.IsPacked = protowire.DecodeBool(v)
 			case fieldnum.FieldOptions_Weak:
-				fd.L1.IsWeak = wire.DecodeBool(v)
+				fd.L1.IsWeak = protowire.DecodeBool(v)
 			case FieldOptions_EnforceUTF8:
 				fd.L1.HasEnforceUTF8 = true
-				fd.L1.EnforceUTF8 = wire.DecodeBool(v)
+				fd.L1.EnforceUTF8 = protowire.DecodeBool(v)
 			}
 		default:
-			m := wire.ConsumeFieldValue(num, typ, b)
+			m := protowire.ConsumeFieldValue(num, typ, b)
 			b = b[m:]
 		}
 	}
@@ -509,11 +509,11 @@
 
 	var rawOptions []byte
 	for len(b) > 0 {
-		num, typ, n := wire.ConsumeTag(b)
+		num, typ, n := protowire.ConsumeTag(b)
 		b = b[n:]
 		switch typ {
-		case wire.BytesType:
-			v, m := wire.ConsumeBytes(b)
+		case protowire.BytesType:
+			v, m := protowire.ConsumeBytes(b)
 			b = b[m:]
 			switch num {
 			case fieldnum.OneofDescriptorProto_Name:
@@ -522,7 +522,7 @@
 				rawOptions = appendOptions(rawOptions, v)
 			}
 		default:
-			m := wire.ConsumeFieldValue(num, typ, b)
+			m := protowire.ConsumeFieldValue(num, typ, b)
 			b = b[m:]
 		}
 	}
@@ -534,11 +534,11 @@
 	var rawOptions []byte
 	xd.L2 = new(ExtensionL2)
 	for len(b) > 0 {
-		num, typ, n := wire.ConsumeTag(b)
+		num, typ, n := protowire.ConsumeTag(b)
 		b = b[n:]
 		switch typ {
-		case wire.BytesType:
-			v, m := wire.ConsumeBytes(b)
+		case protowire.BytesType:
+			v, m := protowire.ConsumeBytes(b)
 			b = b[m:]
 			switch num {
 			case fieldnum.FieldDescriptorProto_JsonName:
@@ -552,7 +552,7 @@
 				rawOptions = appendOptions(rawOptions, v)
 			}
 		default:
-			m := wire.ConsumeFieldValue(num, typ, b)
+			m := protowire.ConsumeFieldValue(num, typ, b)
 			b = b[m:]
 		}
 	}
@@ -570,18 +570,18 @@
 
 func (xd *Extension) unmarshalOptions(b []byte) {
 	for len(b) > 0 {
-		num, typ, n := wire.ConsumeTag(b)
+		num, typ, n := protowire.ConsumeTag(b)
 		b = b[n:]
 		switch typ {
-		case wire.VarintType:
-			v, m := wire.ConsumeVarint(b)
+		case protowire.VarintType:
+			v, m := protowire.ConsumeVarint(b)
 			b = b[m:]
 			switch num {
 			case fieldnum.FieldOptions_Packed:
-				xd.L2.IsPacked = wire.DecodeBool(v)
+				xd.L2.IsPacked = protowire.DecodeBool(v)
 			}
 		default:
-			m := wire.ConsumeFieldValue(num, typ, b)
+			m := protowire.ConsumeFieldValue(num, typ, b)
 			b = b[m:]
 		}
 	}
@@ -592,11 +592,11 @@
 	var rawOptions []byte
 	sd.L2 = new(ServiceL2)
 	for len(b) > 0 {
-		num, typ, n := wire.ConsumeTag(b)
+		num, typ, n := protowire.ConsumeTag(b)
 		b = b[n:]
 		switch typ {
-		case wire.BytesType:
-			v, m := wire.ConsumeBytes(b)
+		case protowire.BytesType:
+			v, m := protowire.ConsumeBytes(b)
 			b = b[m:]
 			switch num {
 			case fieldnum.ServiceDescriptorProto_Method:
@@ -605,7 +605,7 @@
 				rawOptions = appendOptions(rawOptions, v)
 			}
 		default:
-			m := wire.ConsumeFieldValue(num, typ, b)
+			m := protowire.ConsumeFieldValue(num, typ, b)
 			b = b[m:]
 		}
 	}
@@ -625,20 +625,20 @@
 
 	var rawOptions []byte
 	for len(b) > 0 {
-		num, typ, n := wire.ConsumeTag(b)
+		num, typ, n := protowire.ConsumeTag(b)
 		b = b[n:]
 		switch typ {
-		case wire.VarintType:
-			v, m := wire.ConsumeVarint(b)
+		case protowire.VarintType:
+			v, m := protowire.ConsumeVarint(b)
 			b = b[m:]
 			switch num {
 			case fieldnum.MethodDescriptorProto_ClientStreaming:
-				md.L1.IsStreamingClient = wire.DecodeBool(v)
+				md.L1.IsStreamingClient = protowire.DecodeBool(v)
 			case fieldnum.MethodDescriptorProto_ServerStreaming:
-				md.L1.IsStreamingServer = wire.DecodeBool(v)
+				md.L1.IsStreamingServer = protowire.DecodeBool(v)
 			}
-		case wire.BytesType:
-			v, m := wire.ConsumeBytes(b)
+		case protowire.BytesType:
+			v, m := protowire.ConsumeBytes(b)
 			b = b[m:]
 			switch num {
 			case fieldnum.MethodDescriptorProto_Name:
@@ -651,7 +651,7 @@
 				rawOptions = appendOptions(rawOptions, v)
 			}
 		default:
-			m := wire.ConsumeFieldValue(num, typ, b)
+			m := protowire.ConsumeFieldValue(num, typ, b)
 			b = b[m:]
 		}
 	}
diff --git a/internal/filedesc/desc_list.go b/internal/filedesc/desc_list.go
index d251991..1b7089b 100644
--- a/internal/filedesc/desc_list.go
+++ b/internal/filedesc/desc_list.go
@@ -10,8 +10,8 @@
 	"sort"
 	"sync"
 
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/internal/descfmt"
-	"google.golang.org/protobuf/internal/encoding/wire"
 	"google.golang.org/protobuf/internal/errors"
 	"google.golang.org/protobuf/internal/pragma"
 	"google.golang.org/protobuf/reflect/protoreflect"
@@ -186,9 +186,9 @@
 // reserved number range.
 func isValidFieldNumber(n protoreflect.FieldNumber, isMessageSet bool) bool {
 	if isMessageSet {
-		return wire.MinValidNumber <= n && n <= math.MaxInt32
+		return protowire.MinValidNumber <= n && n <= math.MaxInt32
 	}
-	return wire.MinValidNumber <= n && n <= wire.MaxValidNumber
+	return protowire.MinValidNumber <= n && n <= protowire.MaxValidNumber
 }
 
 // CheckOverlap reports an error if p and q overlap.
diff --git a/internal/impl/codec_extension.go b/internal/impl/codec_extension.go
index efeea2f..da67a01 100644
--- a/internal/impl/codec_extension.go
+++ b/internal/impl/codec_extension.go
@@ -8,7 +8,7 @@
 	"sync"
 	"sync/atomic"
 
-	"google.golang.org/protobuf/internal/encoding/wire"
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/internal/errors"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
 )
@@ -46,13 +46,13 @@
 func makeExtensionFieldInfo(xd pref.ExtensionDescriptor) *extensionFieldInfo {
 	var wiretag uint64
 	if !xd.IsPacked() {
-		wiretag = wire.EncodeTag(xd.Number(), wireTypes[xd.Kind()])
+		wiretag = protowire.EncodeTag(xd.Number(), wireTypes[xd.Kind()])
 	} else {
-		wiretag = wire.EncodeTag(xd.Number(), wire.BytesType)
+		wiretag = protowire.EncodeTag(xd.Number(), protowire.BytesType)
 	}
 	e := &extensionFieldInfo{
 		wiretag: wiretag,
-		tagsize: wire.SizeVarint(wiretag),
+		tagsize: protowire.SizeVarint(wiretag),
 		funcs:   encoderFuncsForValue(xd),
 	}
 	// Does the unmarshal function need a value passed to it?
@@ -87,13 +87,13 @@
 	lazy  *lazyExtensionValue
 }
 
-func (f *ExtensionField) appendLazyBytes(xt pref.ExtensionType, xi *extensionFieldInfo, num wire.Number, wtyp wire.Type, b []byte) {
+func (f *ExtensionField) appendLazyBytes(xt pref.ExtensionType, xi *extensionFieldInfo, num protowire.Number, wtyp protowire.Type, b []byte) {
 	if f.lazy == nil {
 		f.lazy = &lazyExtensionValue{xi: xi}
 	}
 	f.typ = xt
 	f.lazy.xi = xi
-	f.lazy.b = wire.AppendTag(f.lazy.b, num, wtyp)
+	f.lazy.b = protowire.AppendTag(f.lazy.b, num, wtyp)
 	f.lazy.b = append(f.lazy.b, b...)
 }
 
@@ -126,14 +126,14 @@
 				b = b[2:]
 			} else {
 				var n int
-				tag, n = wire.ConsumeVarint(b)
+				tag, n = protowire.ConsumeVarint(b)
 				if n < 0 {
 					panic(errors.New("bad tag in lazy extension decoding"))
 				}
 				b = b[n:]
 			}
-			num := wire.Number(tag >> 3)
-			wtyp := wire.Type(tag & 7)
+			num := protowire.Number(tag >> 3)
+			wtyp := protowire.Type(tag & 7)
 			var out unmarshalOutput
 			var err error
 			val, out, err = f.lazy.xi.funcs.unmarshal(b, val, num, wtyp, lazyUnmarshalOptions)
diff --git a/internal/impl/codec_field.go b/internal/impl/codec_field.go
index f9b6836..9497707 100644
--- a/internal/impl/codec_field.go
+++ b/internal/impl/codec_field.go
@@ -9,7 +9,7 @@
 	"reflect"
 	"sync"
 
-	"google.golang.org/protobuf/internal/encoding/wire"
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/proto"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
 	preg "google.golang.org/protobuf/reflect/protoregistry"
@@ -51,7 +51,7 @@
 		if cf.funcs.isInit != nil {
 			needIsInit = true
 		}
-		mi.coderFields[num].funcs.unmarshal = func(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
+		mi.coderFields[num].funcs.unmarshal = func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
 			var vw reflect.Value         // pointer to wrapper type
 			vi := p.AsValueOf(ft).Elem() // oneof field value of interface kind
 			if !vi.IsNil() && !vi.Elem().IsNil() && vi.Elem().Elem().Type() == ot {
@@ -149,7 +149,7 @@
 			}
 			return appendMessage(b, m, f.wiretag, opts)
 		},
-		unmarshal: func(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
+		unmarshal: func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
 			fs := p.WeakFields()
 			m, ok := fs.get(f.num)
 			if !ok {
@@ -210,7 +210,7 @@
 				m := asMessage(p.AsValueOf(ft).Elem())
 				return appendMessage(b, m, f.wiretag, opts)
 			},
-			unmarshal: func(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
+			unmarshal: func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
 				mp := p.AsValueOf(ft).Elem()
 				if mp.IsNil() {
 					mp.Set(reflect.New(ft.Elem()))
@@ -227,22 +227,22 @@
 }
 
 func sizeMessageInfo(p pointer, f *coderFieldInfo, opts marshalOptions) int {
-	return wire.SizeBytes(f.mi.sizePointer(p.Elem(), opts)) + f.tagsize
+	return protowire.SizeBytes(f.mi.sizePointer(p.Elem(), opts)) + f.tagsize
 }
 
 func appendMessageInfo(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendVarint(b, uint64(f.mi.sizePointer(p.Elem(), opts)))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, uint64(f.mi.sizePointer(p.Elem(), opts)))
 	return f.mi.marshalAppendPointer(b, p.Elem(), opts)
 }
 
-func consumeMessageInfo(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.BytesType {
+func consumeMessageInfo(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.BytesType {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeBytes(b)
+	v, n := protowire.ConsumeBytes(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	if p.Elem().IsNil() {
 		p.SetPointer(pointerOfValue(reflect.New(f.mi.GoReflectType.Elem())))
@@ -261,22 +261,22 @@
 }
 
 func sizeMessage(m proto.Message, tagsize int, _ marshalOptions) int {
-	return wire.SizeBytes(proto.Size(m)) + tagsize
+	return protowire.SizeBytes(proto.Size(m)) + tagsize
 }
 
 func appendMessage(b []byte, m proto.Message, wiretag uint64, opts marshalOptions) ([]byte, error) {
-	b = wire.AppendVarint(b, wiretag)
-	b = wire.AppendVarint(b, uint64(proto.Size(m)))
+	b = protowire.AppendVarint(b, wiretag)
+	b = protowire.AppendVarint(b, uint64(proto.Size(m)))
 	return opts.Options().MarshalAppend(b, m)
 }
 
-func consumeMessage(b []byte, m proto.Message, wtyp wire.Type, opts unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.BytesType {
+func consumeMessage(b []byte, m proto.Message, wtyp protowire.Type, opts unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.BytesType {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeBytes(b)
+	v, n := protowire.ConsumeBytes(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{
 		Buf:     v,
@@ -300,7 +300,7 @@
 	return appendMessage(b, m, wiretag, opts)
 }
 
-func consumeMessageValue(b []byte, v pref.Value, _ wire.Number, wtyp wire.Type, opts unmarshalOptions) (pref.Value, unmarshalOutput, error) {
+func consumeMessageValue(b []byte, v pref.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (pref.Value, unmarshalOutput, error) {
 	m := v.Message().Interface()
 	out, err := consumeMessage(b, m, wtyp, opts)
 	return v, out, err
@@ -329,7 +329,7 @@
 	return appendGroup(b, m, wiretag, opts)
 }
 
-func consumeGroupValue(b []byte, v pref.Value, num wire.Number, wtyp wire.Type, opts unmarshalOptions) (pref.Value, unmarshalOutput, error) {
+func consumeGroupValue(b []byte, v pref.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (pref.Value, unmarshalOutput, error) {
 	m := v.Message().Interface()
 	out, err := consumeGroup(b, m, num, wtyp, opts)
 	return v, out, err
@@ -366,7 +366,7 @@
 				m := asMessage(p.AsValueOf(ft).Elem())
 				return appendGroup(b, m, f.wiretag, opts)
 			},
-			unmarshal: func(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
+			unmarshal: func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
 				mp := p.AsValueOf(ft).Elem()
 				if mp.IsNil() {
 					mp.Set(reflect.New(ft.Elem()))
@@ -387,14 +387,14 @@
 }
 
 func appendGroupType(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
-	b = wire.AppendVarint(b, f.wiretag) // start group
+	b = protowire.AppendVarint(b, f.wiretag) // start group
 	b, err := f.mi.marshalAppendPointer(b, p.Elem(), opts)
-	b = wire.AppendVarint(b, f.wiretag+1) // end group
+	b = protowire.AppendVarint(b, f.wiretag+1) // end group
 	return b, err
 }
 
-func consumeGroupType(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.StartGroupType {
+func consumeGroupType(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.StartGroupType {
 		return out, errUnknown
 	}
 	if p.Elem().IsNil() {
@@ -408,19 +408,19 @@
 }
 
 func appendGroup(b []byte, m proto.Message, wiretag uint64, opts marshalOptions) ([]byte, error) {
-	b = wire.AppendVarint(b, wiretag) // start group
+	b = protowire.AppendVarint(b, wiretag) // start group
 	b, err := opts.Options().MarshalAppend(b, m)
-	b = wire.AppendVarint(b, wiretag+1) // end group
+	b = protowire.AppendVarint(b, wiretag+1) // end group
 	return b, err
 }
 
-func consumeGroup(b []byte, m proto.Message, num wire.Number, wtyp wire.Type, opts unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.StartGroupType {
+func consumeGroup(b []byte, m proto.Message, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.StartGroupType {
 		return out, errUnknown
 	}
-	b, n := wire.ConsumeGroup(num, b)
+	b, n := protowire.ConsumeGroup(num, b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{
 		Buf:     b,
@@ -454,7 +454,7 @@
 		marshal: func(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
 			return appendMessageSlice(b, p, f.wiretag, ft, opts)
 		},
-		unmarshal: func(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
+		unmarshal: func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
 			return consumeMessageSlice(b, p, ft, wtyp, opts)
 		},
 		isInit: func(p pointer, f *coderFieldInfo) error {
@@ -468,7 +468,7 @@
 	s := p.PointerSlice()
 	n := 0
 	for _, v := range s {
-		n += wire.SizeBytes(f.mi.sizePointer(v, opts)) + f.tagsize
+		n += protowire.SizeBytes(f.mi.sizePointer(v, opts)) + f.tagsize
 	}
 	return n
 }
@@ -477,9 +477,9 @@
 	s := p.PointerSlice()
 	var err error
 	for _, v := range s {
-		b = wire.AppendVarint(b, f.wiretag)
+		b = protowire.AppendVarint(b, f.wiretag)
 		siz := f.mi.sizePointer(v, opts)
-		b = wire.AppendVarint(b, uint64(siz))
+		b = protowire.AppendVarint(b, uint64(siz))
 		b, err = f.mi.marshalAppendPointer(b, v, opts)
 		if err != nil {
 			return b, err
@@ -488,13 +488,13 @@
 	return b, nil
 }
 
-func consumeMessageSliceInfo(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.BytesType {
+func consumeMessageSliceInfo(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.BytesType {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeBytes(b)
+	v, n := protowire.ConsumeBytes(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	m := reflect.New(f.mi.GoReflectType.Elem()).Interface()
 	mp := pointerOfIface(m)
@@ -523,7 +523,7 @@
 	n := 0
 	for _, v := range s {
 		m := asMessage(v.AsValueOf(goType.Elem()))
-		n += wire.SizeBytes(proto.Size(m)) + tagsize
+		n += protowire.SizeBytes(proto.Size(m)) + tagsize
 	}
 	return n
 }
@@ -533,9 +533,9 @@
 	var err error
 	for _, v := range s {
 		m := asMessage(v.AsValueOf(goType.Elem()))
-		b = wire.AppendVarint(b, wiretag)
+		b = protowire.AppendVarint(b, wiretag)
 		siz := proto.Size(m)
-		b = wire.AppendVarint(b, uint64(siz))
+		b = protowire.AppendVarint(b, uint64(siz))
 		b, err = opts.Options().MarshalAppend(b, m)
 		if err != nil {
 			return b, err
@@ -544,13 +544,13 @@
 	return b, nil
 }
 
-func consumeMessageSlice(b []byte, p pointer, goType reflect.Type, wtyp wire.Type, opts unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.BytesType {
+func consumeMessageSlice(b []byte, p pointer, goType reflect.Type, wtyp protowire.Type, opts unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.BytesType {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeBytes(b)
+	v, n := protowire.ConsumeBytes(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	mp := reflect.New(goType.Elem())
 	o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{
@@ -584,7 +584,7 @@
 	n := 0
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		m := list.Get(i).Message().Interface()
-		n += wire.SizeBytes(proto.Size(m)) + tagsize
+		n += protowire.SizeBytes(proto.Size(m)) + tagsize
 	}
 	return n
 }
@@ -594,9 +594,9 @@
 	mopts := opts.Options()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		m := list.Get(i).Message().Interface()
-		b = wire.AppendVarint(b, wiretag)
+		b = protowire.AppendVarint(b, wiretag)
 		siz := proto.Size(m)
-		b = wire.AppendVarint(b, uint64(siz))
+		b = protowire.AppendVarint(b, uint64(siz))
 		var err error
 		b, err = mopts.MarshalAppend(b, m)
 		if err != nil {
@@ -606,14 +606,14 @@
 	return b, nil
 }
 
-func consumeMessageSliceValue(b []byte, listv pref.Value, _ wire.Number, wtyp wire.Type, opts unmarshalOptions) (_ pref.Value, out unmarshalOutput, err error) {
+func consumeMessageSliceValue(b []byte, listv pref.Value, _ protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ pref.Value, out unmarshalOutput, err error) {
 	list := listv.List()
-	if wtyp != wire.BytesType {
+	if wtyp != protowire.BytesType {
 		return pref.Value{}, out, errUnknown
 	}
-	v, n := wire.ConsumeBytes(b)
+	v, n := protowire.ConsumeBytes(b)
 	if n < 0 {
-		return pref.Value{}, out, wire.ParseError(n)
+		return pref.Value{}, out, protowire.ParseError(n)
 	}
 	m := list.NewElement()
 	o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{
@@ -663,25 +663,25 @@
 	mopts := opts.Options()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		m := list.Get(i).Message().Interface()
-		b = wire.AppendVarint(b, wiretag) // start group
+		b = protowire.AppendVarint(b, wiretag) // start group
 		var err error
 		b, err = mopts.MarshalAppend(b, m)
 		if err != nil {
 			return b, err
 		}
-		b = wire.AppendVarint(b, wiretag+1) // end group
+		b = protowire.AppendVarint(b, wiretag+1) // end group
 	}
 	return b, nil
 }
 
-func consumeGroupSliceValue(b []byte, listv pref.Value, num wire.Number, wtyp wire.Type, opts unmarshalOptions) (_ pref.Value, out unmarshalOutput, err error) {
+func consumeGroupSliceValue(b []byte, listv pref.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (_ pref.Value, out unmarshalOutput, err error) {
 	list := listv.List()
-	if wtyp != wire.StartGroupType {
+	if wtyp != protowire.StartGroupType {
 		return pref.Value{}, out, errUnknown
 	}
-	b, n := wire.ConsumeGroup(num, b)
+	b, n := protowire.ConsumeGroup(num, b)
 	if n < 0 {
-		return pref.Value{}, out, wire.ParseError(n)
+		return pref.Value{}, out, protowire.ParseError(n)
 	}
 	m := list.NewElement()
 	o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{
@@ -726,7 +726,7 @@
 		marshal: func(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
 			return appendGroupSlice(b, p, f.wiretag, ft, opts)
 		},
-		unmarshal: func(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
+		unmarshal: func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
 			return consumeGroupSlice(b, p, num, wtyp, ft, opts)
 		},
 		isInit: func(p pointer, f *coderFieldInfo) error {
@@ -751,23 +751,23 @@
 	var err error
 	for _, v := range s {
 		m := asMessage(v.AsValueOf(messageType.Elem()))
-		b = wire.AppendVarint(b, wiretag) // start group
+		b = protowire.AppendVarint(b, wiretag) // start group
 		b, err = opts.Options().MarshalAppend(b, m)
 		if err != nil {
 			return b, err
 		}
-		b = wire.AppendVarint(b, wiretag+1) // end group
+		b = protowire.AppendVarint(b, wiretag+1) // end group
 	}
 	return b, nil
 }
 
-func consumeGroupSlice(b []byte, p pointer, num wire.Number, wtyp wire.Type, goType reflect.Type, opts unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.StartGroupType {
+func consumeGroupSlice(b []byte, p pointer, num protowire.Number, wtyp protowire.Type, goType reflect.Type, opts unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.StartGroupType {
 		return out, errUnknown
 	}
-	b, n := wire.ConsumeGroup(num, b)
+	b, n := protowire.ConsumeGroup(num, b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	mp := reflect.New(goType.Elem())
 	o, err := opts.Options().UnmarshalState(piface.UnmarshalInput{
@@ -796,18 +796,18 @@
 	s := p.PointerSlice()
 	var err error
 	for _, v := range s {
-		b = wire.AppendVarint(b, f.wiretag) // start group
+		b = protowire.AppendVarint(b, f.wiretag) // start group
 		b, err = f.mi.marshalAppendPointer(b, v, opts)
 		if err != nil {
 			return b, err
 		}
-		b = wire.AppendVarint(b, f.wiretag+1) // end group
+		b = protowire.AppendVarint(b, f.wiretag+1) // end group
 	}
 	return b, nil
 }
 
-func consumeGroupSliceInfo(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
-	if wtyp != wire.StartGroupType {
+func consumeGroupSliceInfo(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
+	if wtyp != protowire.StartGroupType {
 		return unmarshalOutput{}, errUnknown
 	}
 	m := reflect.New(f.mi.GoReflectType.Elem()).Interface()
diff --git a/internal/impl/codec_gen.go b/internal/impl/codec_gen.go
index 6036b66..2c43b11 100644
--- a/internal/impl/codec_gen.go
+++ b/internal/impl/codec_gen.go
@@ -10,27 +10,27 @@
 	"math"
 	"unicode/utf8"
 
-	"google.golang.org/protobuf/internal/encoding/wire"
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/reflect/protoreflect"
 )
 
 // sizeBool returns the size of wire encoding a bool pointer as a Bool.
 func sizeBool(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	v := *p.Bool()
-	return f.tagsize + wire.SizeVarint(wire.EncodeBool(v))
+	return f.tagsize + protowire.SizeVarint(protowire.EncodeBool(v))
 }
 
 // appendBool wire encodes a bool pointer as a Bool.
 func appendBool(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := *p.Bool()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendVarint(b, wire.EncodeBool(v))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, protowire.EncodeBool(v))
 	return b, nil
 }
 
 // consumeBool wire decodes a bool pointer as a Bool.
-func consumeBool(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.VarintType {
+func consumeBool(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.VarintType {
 		return out, errUnknown
 	}
 	var v uint64
@@ -42,12 +42,12 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
-	*p.Bool() = wire.DecodeBool(v)
+	*p.Bool() = protowire.DecodeBool(v)
 	out.n = n
 	return out, nil
 }
@@ -66,7 +66,7 @@
 	if v == false {
 		return 0
 	}
-	return f.tagsize + wire.SizeVarint(wire.EncodeBool(v))
+	return f.tagsize + protowire.SizeVarint(protowire.EncodeBool(v))
 }
 
 // appendBoolNoZero wire encodes a bool pointer as a Bool.
@@ -76,8 +76,8 @@
 	if v == false {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendVarint(b, wire.EncodeBool(v))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, protowire.EncodeBool(v))
 	return b, nil
 }
 
@@ -92,21 +92,21 @@
 // It panics if the pointer is nil.
 func sizeBoolPtr(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	v := **p.BoolPtr()
-	return f.tagsize + wire.SizeVarint(wire.EncodeBool(v))
+	return f.tagsize + protowire.SizeVarint(protowire.EncodeBool(v))
 }
 
 // appendBoolPtr wire encodes a *bool pointer as a Bool.
 // It panics if the pointer is nil.
 func appendBoolPtr(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := **p.BoolPtr()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendVarint(b, wire.EncodeBool(v))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, protowire.EncodeBool(v))
 	return b, nil
 }
 
 // consumeBoolPtr wire decodes a *bool pointer as a Bool.
-func consumeBoolPtr(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.VarintType {
+func consumeBoolPtr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.VarintType {
 		return out, errUnknown
 	}
 	var v uint64
@@ -118,16 +118,16 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	vp := p.BoolPtr()
 	if *vp == nil {
 		*vp = new(bool)
 	}
-	**vp = wire.DecodeBool(v)
+	**vp = protowire.DecodeBool(v)
 	out.n = n
 	return out, nil
 }
@@ -143,7 +143,7 @@
 func sizeBoolSlice(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	s := *p.BoolSlice()
 	for _, v := range s {
-		size += f.tagsize + wire.SizeVarint(wire.EncodeBool(v))
+		size += f.tagsize + protowire.SizeVarint(protowire.EncodeBool(v))
 	}
 	return size
 }
@@ -152,20 +152,20 @@
 func appendBoolSlice(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	s := *p.BoolSlice()
 	for _, v := range s {
-		b = wire.AppendVarint(b, f.wiretag)
-		b = wire.AppendVarint(b, wire.EncodeBool(v))
+		b = protowire.AppendVarint(b, f.wiretag)
+		b = protowire.AppendVarint(b, protowire.EncodeBool(v))
 	}
 	return b, nil
 }
 
 // consumeBoolSlice wire decodes a []bool pointer as a repeated Bool.
-func consumeBoolSlice(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+func consumeBoolSlice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
 	sp := p.BoolSlice()
-	if wtyp == wire.BytesType {
+	if wtyp == protowire.BytesType {
 		s := *sp
-		b, n := wire.ConsumeBytes(b)
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return out, wire.ParseError(n)
+			return out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
 			var v uint64
@@ -177,19 +177,19 @@
 				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 				n = 2
 			} else {
-				v, n = wire.ConsumeVarint(b)
+				v, n = protowire.ConsumeVarint(b)
 			}
 			if n < 0 {
-				return out, wire.ParseError(n)
+				return out, protowire.ParseError(n)
 			}
-			s = append(s, wire.DecodeBool(v))
+			s = append(s, protowire.DecodeBool(v))
 			b = b[n:]
 		}
 		*sp = s
 		out.n = n
 		return out, nil
 	}
-	if wtyp != wire.VarintType {
+	if wtyp != protowire.VarintType {
 		return out, errUnknown
 	}
 	var v uint64
@@ -201,12 +201,12 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
-	*sp = append(*sp, wire.DecodeBool(v))
+	*sp = append(*sp, protowire.DecodeBool(v))
 	out.n = n
 	return out, nil
 }
@@ -226,9 +226,9 @@
 	}
 	n := 0
 	for _, v := range s {
-		n += wire.SizeVarint(wire.EncodeBool(v))
+		n += protowire.SizeVarint(protowire.EncodeBool(v))
 	}
-	return f.tagsize + wire.SizeBytes(n)
+	return f.tagsize + protowire.SizeBytes(n)
 }
 
 // appendBoolPackedSlice encodes a []bool pointer as a packed repeated Bool.
@@ -237,14 +237,14 @@
 	if len(s) == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, f.wiretag)
 	n := 0
 	for _, v := range s {
-		n += wire.SizeVarint(wire.EncodeBool(v))
+		n += protowire.SizeVarint(protowire.EncodeBool(v))
 	}
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, uint64(n))
 	for _, v := range s {
-		b = wire.AppendVarint(b, wire.EncodeBool(v))
+		b = protowire.AppendVarint(b, protowire.EncodeBool(v))
 	}
 	return b, nil
 }
@@ -258,19 +258,19 @@
 
 // sizeBoolValue returns the size of wire encoding a bool value as a Bool.
 func sizeBoolValue(v protoreflect.Value, tagsize int, _ marshalOptions) int {
-	return tagsize + wire.SizeVarint(wire.EncodeBool(v.Bool()))
+	return tagsize + protowire.SizeVarint(protowire.EncodeBool(v.Bool()))
 }
 
 // appendBoolValue encodes a bool value as a Bool.
 func appendBoolValue(b []byte, v protoreflect.Value, wiretag uint64, _ marshalOptions) ([]byte, error) {
-	b = wire.AppendVarint(b, wiretag)
-	b = wire.AppendVarint(b, wire.EncodeBool(v.Bool()))
+	b = protowire.AppendVarint(b, wiretag)
+	b = protowire.AppendVarint(b, protowire.EncodeBool(v.Bool()))
 	return b, nil
 }
 
 // consumeBoolValue decodes a bool value as a Bool.
-func consumeBoolValue(b []byte, _ protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
-	if wtyp != wire.VarintType {
+func consumeBoolValue(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+	if wtyp != protowire.VarintType {
 		return protoreflect.Value{}, out, errUnknown
 	}
 	var v uint64
@@ -282,13 +282,13 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	out.n = n
-	return protoreflect.ValueOfBool(wire.DecodeBool(v)), out, nil
+	return protoreflect.ValueOfBool(protowire.DecodeBool(v)), out, nil
 }
 
 var coderBoolValue = valueCoderFuncs{
@@ -303,7 +303,7 @@
 	list := listv.List()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		v := list.Get(i)
-		size += tagsize + wire.SizeVarint(wire.EncodeBool(v.Bool()))
+		size += tagsize + protowire.SizeVarint(protowire.EncodeBool(v.Bool()))
 	}
 	return size
 }
@@ -313,19 +313,19 @@
 	list := listv.List()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendVarint(b, wiretag)
-		b = wire.AppendVarint(b, wire.EncodeBool(v.Bool()))
+		b = protowire.AppendVarint(b, wiretag)
+		b = protowire.AppendVarint(b, protowire.EncodeBool(v.Bool()))
 	}
 	return b, nil
 }
 
 // consumeBoolSliceValue wire decodes a []bool value as a repeated Bool.
-func consumeBoolSliceValue(b []byte, listv protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+func consumeBoolSliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
 	list := listv.List()
-	if wtyp == wire.BytesType {
-		b, n := wire.ConsumeBytes(b)
+	if wtyp == protowire.BytesType {
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return protoreflect.Value{}, out, wire.ParseError(n)
+			return protoreflect.Value{}, out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
 			var v uint64
@@ -337,18 +337,18 @@
 				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 				n = 2
 			} else {
-				v, n = wire.ConsumeVarint(b)
+				v, n = protowire.ConsumeVarint(b)
 			}
 			if n < 0 {
-				return protoreflect.Value{}, out, wire.ParseError(n)
+				return protoreflect.Value{}, out, protowire.ParseError(n)
 			}
-			list.Append(protoreflect.ValueOfBool(wire.DecodeBool(v)))
+			list.Append(protoreflect.ValueOfBool(protowire.DecodeBool(v)))
 			b = b[n:]
 		}
 		out.n = n
 		return listv, out, nil
 	}
-	if wtyp != wire.VarintType {
+	if wtyp != protowire.VarintType {
 		return protoreflect.Value{}, out, errUnknown
 	}
 	var v uint64
@@ -360,12 +360,12 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
-	list.Append(protoreflect.ValueOfBool(wire.DecodeBool(v)))
+	list.Append(protoreflect.ValueOfBool(protowire.DecodeBool(v)))
 	out.n = n
 	return listv, out, nil
 }
@@ -387,9 +387,9 @@
 	n := 0
 	for i, llen := 0, llen; i < llen; i++ {
 		v := list.Get(i)
-		n += wire.SizeVarint(wire.EncodeBool(v.Bool()))
+		n += protowire.SizeVarint(protowire.EncodeBool(v.Bool()))
 	}
-	return tagsize + wire.SizeBytes(n)
+	return tagsize + protowire.SizeBytes(n)
 }
 
 // appendBoolPackedSliceValue encodes a []bool value as a packed repeated Bool.
@@ -399,16 +399,16 @@
 	if llen == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, wiretag)
+	b = protowire.AppendVarint(b, wiretag)
 	n := 0
 	for i := 0; i < llen; i++ {
 		v := list.Get(i)
-		n += wire.SizeVarint(wire.EncodeBool(v.Bool()))
+		n += protowire.SizeVarint(protowire.EncodeBool(v.Bool()))
 	}
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, uint64(n))
 	for i := 0; i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendVarint(b, wire.EncodeBool(v.Bool()))
+		b = protowire.AppendVarint(b, protowire.EncodeBool(v.Bool()))
 	}
 	return b, nil
 }
@@ -422,19 +422,19 @@
 
 // sizeEnumValue returns the size of wire encoding a  value as a Enum.
 func sizeEnumValue(v protoreflect.Value, tagsize int, _ marshalOptions) int {
-	return tagsize + wire.SizeVarint(uint64(v.Enum()))
+	return tagsize + protowire.SizeVarint(uint64(v.Enum()))
 }
 
 // appendEnumValue encodes a  value as a Enum.
 func appendEnumValue(b []byte, v protoreflect.Value, wiretag uint64, _ marshalOptions) ([]byte, error) {
-	b = wire.AppendVarint(b, wiretag)
-	b = wire.AppendVarint(b, uint64(v.Enum()))
+	b = protowire.AppendVarint(b, wiretag)
+	b = protowire.AppendVarint(b, uint64(v.Enum()))
 	return b, nil
 }
 
 // consumeEnumValue decodes a  value as a Enum.
-func consumeEnumValue(b []byte, _ protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
-	if wtyp != wire.VarintType {
+func consumeEnumValue(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+	if wtyp != protowire.VarintType {
 		return protoreflect.Value{}, out, errUnknown
 	}
 	var v uint64
@@ -446,10 +446,10 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	out.n = n
 	return protoreflect.ValueOfEnum(protoreflect.EnumNumber(v)), out, nil
@@ -467,7 +467,7 @@
 	list := listv.List()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		v := list.Get(i)
-		size += tagsize + wire.SizeVarint(uint64(v.Enum()))
+		size += tagsize + protowire.SizeVarint(uint64(v.Enum()))
 	}
 	return size
 }
@@ -477,19 +477,19 @@
 	list := listv.List()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendVarint(b, wiretag)
-		b = wire.AppendVarint(b, uint64(v.Enum()))
+		b = protowire.AppendVarint(b, wiretag)
+		b = protowire.AppendVarint(b, uint64(v.Enum()))
 	}
 	return b, nil
 }
 
 // consumeEnumSliceValue wire decodes a [] value as a repeated Enum.
-func consumeEnumSliceValue(b []byte, listv protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+func consumeEnumSliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
 	list := listv.List()
-	if wtyp == wire.BytesType {
-		b, n := wire.ConsumeBytes(b)
+	if wtyp == protowire.BytesType {
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return protoreflect.Value{}, out, wire.ParseError(n)
+			return protoreflect.Value{}, out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
 			var v uint64
@@ -501,10 +501,10 @@
 				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 				n = 2
 			} else {
-				v, n = wire.ConsumeVarint(b)
+				v, n = protowire.ConsumeVarint(b)
 			}
 			if n < 0 {
-				return protoreflect.Value{}, out, wire.ParseError(n)
+				return protoreflect.Value{}, out, protowire.ParseError(n)
 			}
 			list.Append(protoreflect.ValueOfEnum(protoreflect.EnumNumber(v)))
 			b = b[n:]
@@ -512,7 +512,7 @@
 		out.n = n
 		return listv, out, nil
 	}
-	if wtyp != wire.VarintType {
+	if wtyp != protowire.VarintType {
 		return protoreflect.Value{}, out, errUnknown
 	}
 	var v uint64
@@ -524,10 +524,10 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	list.Append(protoreflect.ValueOfEnum(protoreflect.EnumNumber(v)))
 	out.n = n
@@ -551,9 +551,9 @@
 	n := 0
 	for i, llen := 0, llen; i < llen; i++ {
 		v := list.Get(i)
-		n += wire.SizeVarint(uint64(v.Enum()))
+		n += protowire.SizeVarint(uint64(v.Enum()))
 	}
-	return tagsize + wire.SizeBytes(n)
+	return tagsize + protowire.SizeBytes(n)
 }
 
 // appendEnumPackedSliceValue encodes a [] value as a packed repeated Enum.
@@ -563,16 +563,16 @@
 	if llen == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, wiretag)
+	b = protowire.AppendVarint(b, wiretag)
 	n := 0
 	for i := 0; i < llen; i++ {
 		v := list.Get(i)
-		n += wire.SizeVarint(uint64(v.Enum()))
+		n += protowire.SizeVarint(uint64(v.Enum()))
 	}
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, uint64(n))
 	for i := 0; i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendVarint(b, uint64(v.Enum()))
+		b = protowire.AppendVarint(b, uint64(v.Enum()))
 	}
 	return b, nil
 }
@@ -587,20 +587,20 @@
 // sizeInt32 returns the size of wire encoding a int32 pointer as a Int32.
 func sizeInt32(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	v := *p.Int32()
-	return f.tagsize + wire.SizeVarint(uint64(v))
+	return f.tagsize + protowire.SizeVarint(uint64(v))
 }
 
 // appendInt32 wire encodes a int32 pointer as a Int32.
 func appendInt32(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := *p.Int32()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendVarint(b, uint64(v))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, uint64(v))
 	return b, nil
 }
 
 // consumeInt32 wire decodes a int32 pointer as a Int32.
-func consumeInt32(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.VarintType {
+func consumeInt32(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.VarintType {
 		return out, errUnknown
 	}
 	var v uint64
@@ -612,10 +612,10 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	*p.Int32() = int32(v)
 	out.n = n
@@ -636,7 +636,7 @@
 	if v == 0 {
 		return 0
 	}
-	return f.tagsize + wire.SizeVarint(uint64(v))
+	return f.tagsize + protowire.SizeVarint(uint64(v))
 }
 
 // appendInt32NoZero wire encodes a int32 pointer as a Int32.
@@ -646,8 +646,8 @@
 	if v == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendVarint(b, uint64(v))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, uint64(v))
 	return b, nil
 }
 
@@ -662,21 +662,21 @@
 // It panics if the pointer is nil.
 func sizeInt32Ptr(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	v := **p.Int32Ptr()
-	return f.tagsize + wire.SizeVarint(uint64(v))
+	return f.tagsize + protowire.SizeVarint(uint64(v))
 }
 
 // appendInt32Ptr wire encodes a *int32 pointer as a Int32.
 // It panics if the pointer is nil.
 func appendInt32Ptr(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := **p.Int32Ptr()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendVarint(b, uint64(v))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, uint64(v))
 	return b, nil
 }
 
 // consumeInt32Ptr wire decodes a *int32 pointer as a Int32.
-func consumeInt32Ptr(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.VarintType {
+func consumeInt32Ptr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.VarintType {
 		return out, errUnknown
 	}
 	var v uint64
@@ -688,10 +688,10 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	vp := p.Int32Ptr()
 	if *vp == nil {
@@ -713,7 +713,7 @@
 func sizeInt32Slice(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	s := *p.Int32Slice()
 	for _, v := range s {
-		size += f.tagsize + wire.SizeVarint(uint64(v))
+		size += f.tagsize + protowire.SizeVarint(uint64(v))
 	}
 	return size
 }
@@ -722,20 +722,20 @@
 func appendInt32Slice(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	s := *p.Int32Slice()
 	for _, v := range s {
-		b = wire.AppendVarint(b, f.wiretag)
-		b = wire.AppendVarint(b, uint64(v))
+		b = protowire.AppendVarint(b, f.wiretag)
+		b = protowire.AppendVarint(b, uint64(v))
 	}
 	return b, nil
 }
 
 // consumeInt32Slice wire decodes a []int32 pointer as a repeated Int32.
-func consumeInt32Slice(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+func consumeInt32Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
 	sp := p.Int32Slice()
-	if wtyp == wire.BytesType {
+	if wtyp == protowire.BytesType {
 		s := *sp
-		b, n := wire.ConsumeBytes(b)
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return out, wire.ParseError(n)
+			return out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
 			var v uint64
@@ -747,10 +747,10 @@
 				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 				n = 2
 			} else {
-				v, n = wire.ConsumeVarint(b)
+				v, n = protowire.ConsumeVarint(b)
 			}
 			if n < 0 {
-				return out, wire.ParseError(n)
+				return out, protowire.ParseError(n)
 			}
 			s = append(s, int32(v))
 			b = b[n:]
@@ -759,7 +759,7 @@
 		out.n = n
 		return out, nil
 	}
-	if wtyp != wire.VarintType {
+	if wtyp != protowire.VarintType {
 		return out, errUnknown
 	}
 	var v uint64
@@ -771,10 +771,10 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	*sp = append(*sp, int32(v))
 	out.n = n
@@ -796,9 +796,9 @@
 	}
 	n := 0
 	for _, v := range s {
-		n += wire.SizeVarint(uint64(v))
+		n += protowire.SizeVarint(uint64(v))
 	}
-	return f.tagsize + wire.SizeBytes(n)
+	return f.tagsize + protowire.SizeBytes(n)
 }
 
 // appendInt32PackedSlice encodes a []int32 pointer as a packed repeated Int32.
@@ -807,14 +807,14 @@
 	if len(s) == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, f.wiretag)
 	n := 0
 	for _, v := range s {
-		n += wire.SizeVarint(uint64(v))
+		n += protowire.SizeVarint(uint64(v))
 	}
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, uint64(n))
 	for _, v := range s {
-		b = wire.AppendVarint(b, uint64(v))
+		b = protowire.AppendVarint(b, uint64(v))
 	}
 	return b, nil
 }
@@ -828,19 +828,19 @@
 
 // sizeInt32Value returns the size of wire encoding a int32 value as a Int32.
 func sizeInt32Value(v protoreflect.Value, tagsize int, _ marshalOptions) int {
-	return tagsize + wire.SizeVarint(uint64(int32(v.Int())))
+	return tagsize + protowire.SizeVarint(uint64(int32(v.Int())))
 }
 
 // appendInt32Value encodes a int32 value as a Int32.
 func appendInt32Value(b []byte, v protoreflect.Value, wiretag uint64, _ marshalOptions) ([]byte, error) {
-	b = wire.AppendVarint(b, wiretag)
-	b = wire.AppendVarint(b, uint64(int32(v.Int())))
+	b = protowire.AppendVarint(b, wiretag)
+	b = protowire.AppendVarint(b, uint64(int32(v.Int())))
 	return b, nil
 }
 
 // consumeInt32Value decodes a int32 value as a Int32.
-func consumeInt32Value(b []byte, _ protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
-	if wtyp != wire.VarintType {
+func consumeInt32Value(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+	if wtyp != protowire.VarintType {
 		return protoreflect.Value{}, out, errUnknown
 	}
 	var v uint64
@@ -852,10 +852,10 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	out.n = n
 	return protoreflect.ValueOfInt32(int32(v)), out, nil
@@ -873,7 +873,7 @@
 	list := listv.List()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		v := list.Get(i)
-		size += tagsize + wire.SizeVarint(uint64(int32(v.Int())))
+		size += tagsize + protowire.SizeVarint(uint64(int32(v.Int())))
 	}
 	return size
 }
@@ -883,19 +883,19 @@
 	list := listv.List()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendVarint(b, wiretag)
-		b = wire.AppendVarint(b, uint64(int32(v.Int())))
+		b = protowire.AppendVarint(b, wiretag)
+		b = protowire.AppendVarint(b, uint64(int32(v.Int())))
 	}
 	return b, nil
 }
 
 // consumeInt32SliceValue wire decodes a []int32 value as a repeated Int32.
-func consumeInt32SliceValue(b []byte, listv protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+func consumeInt32SliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
 	list := listv.List()
-	if wtyp == wire.BytesType {
-		b, n := wire.ConsumeBytes(b)
+	if wtyp == protowire.BytesType {
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return protoreflect.Value{}, out, wire.ParseError(n)
+			return protoreflect.Value{}, out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
 			var v uint64
@@ -907,10 +907,10 @@
 				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 				n = 2
 			} else {
-				v, n = wire.ConsumeVarint(b)
+				v, n = protowire.ConsumeVarint(b)
 			}
 			if n < 0 {
-				return protoreflect.Value{}, out, wire.ParseError(n)
+				return protoreflect.Value{}, out, protowire.ParseError(n)
 			}
 			list.Append(protoreflect.ValueOfInt32(int32(v)))
 			b = b[n:]
@@ -918,7 +918,7 @@
 		out.n = n
 		return listv, out, nil
 	}
-	if wtyp != wire.VarintType {
+	if wtyp != protowire.VarintType {
 		return protoreflect.Value{}, out, errUnknown
 	}
 	var v uint64
@@ -930,10 +930,10 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	list.Append(protoreflect.ValueOfInt32(int32(v)))
 	out.n = n
@@ -957,9 +957,9 @@
 	n := 0
 	for i, llen := 0, llen; i < llen; i++ {
 		v := list.Get(i)
-		n += wire.SizeVarint(uint64(int32(v.Int())))
+		n += protowire.SizeVarint(uint64(int32(v.Int())))
 	}
-	return tagsize + wire.SizeBytes(n)
+	return tagsize + protowire.SizeBytes(n)
 }
 
 // appendInt32PackedSliceValue encodes a []int32 value as a packed repeated Int32.
@@ -969,16 +969,16 @@
 	if llen == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, wiretag)
+	b = protowire.AppendVarint(b, wiretag)
 	n := 0
 	for i := 0; i < llen; i++ {
 		v := list.Get(i)
-		n += wire.SizeVarint(uint64(int32(v.Int())))
+		n += protowire.SizeVarint(uint64(int32(v.Int())))
 	}
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, uint64(n))
 	for i := 0; i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendVarint(b, uint64(int32(v.Int())))
+		b = protowire.AppendVarint(b, uint64(int32(v.Int())))
 	}
 	return b, nil
 }
@@ -993,20 +993,20 @@
 // sizeSint32 returns the size of wire encoding a int32 pointer as a Sint32.
 func sizeSint32(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	v := *p.Int32()
-	return f.tagsize + wire.SizeVarint(wire.EncodeZigZag(int64(v)))
+	return f.tagsize + protowire.SizeVarint(protowire.EncodeZigZag(int64(v)))
 }
 
 // appendSint32 wire encodes a int32 pointer as a Sint32.
 func appendSint32(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := *p.Int32()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendVarint(b, wire.EncodeZigZag(int64(v)))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, protowire.EncodeZigZag(int64(v)))
 	return b, nil
 }
 
 // consumeSint32 wire decodes a int32 pointer as a Sint32.
-func consumeSint32(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.VarintType {
+func consumeSint32(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.VarintType {
 		return out, errUnknown
 	}
 	var v uint64
@@ -1018,12 +1018,12 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
-	*p.Int32() = int32(wire.DecodeZigZag(v & math.MaxUint32))
+	*p.Int32() = int32(protowire.DecodeZigZag(v & math.MaxUint32))
 	out.n = n
 	return out, nil
 }
@@ -1042,7 +1042,7 @@
 	if v == 0 {
 		return 0
 	}
-	return f.tagsize + wire.SizeVarint(wire.EncodeZigZag(int64(v)))
+	return f.tagsize + protowire.SizeVarint(protowire.EncodeZigZag(int64(v)))
 }
 
 // appendSint32NoZero wire encodes a int32 pointer as a Sint32.
@@ -1052,8 +1052,8 @@
 	if v == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendVarint(b, wire.EncodeZigZag(int64(v)))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, protowire.EncodeZigZag(int64(v)))
 	return b, nil
 }
 
@@ -1068,21 +1068,21 @@
 // It panics if the pointer is nil.
 func sizeSint32Ptr(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	v := **p.Int32Ptr()
-	return f.tagsize + wire.SizeVarint(wire.EncodeZigZag(int64(v)))
+	return f.tagsize + protowire.SizeVarint(protowire.EncodeZigZag(int64(v)))
 }
 
 // appendSint32Ptr wire encodes a *int32 pointer as a Sint32.
 // It panics if the pointer is nil.
 func appendSint32Ptr(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := **p.Int32Ptr()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendVarint(b, wire.EncodeZigZag(int64(v)))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, protowire.EncodeZigZag(int64(v)))
 	return b, nil
 }
 
 // consumeSint32Ptr wire decodes a *int32 pointer as a Sint32.
-func consumeSint32Ptr(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.VarintType {
+func consumeSint32Ptr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.VarintType {
 		return out, errUnknown
 	}
 	var v uint64
@@ -1094,16 +1094,16 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	vp := p.Int32Ptr()
 	if *vp == nil {
 		*vp = new(int32)
 	}
-	**vp = int32(wire.DecodeZigZag(v & math.MaxUint32))
+	**vp = int32(protowire.DecodeZigZag(v & math.MaxUint32))
 	out.n = n
 	return out, nil
 }
@@ -1119,7 +1119,7 @@
 func sizeSint32Slice(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	s := *p.Int32Slice()
 	for _, v := range s {
-		size += f.tagsize + wire.SizeVarint(wire.EncodeZigZag(int64(v)))
+		size += f.tagsize + protowire.SizeVarint(protowire.EncodeZigZag(int64(v)))
 	}
 	return size
 }
@@ -1128,20 +1128,20 @@
 func appendSint32Slice(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	s := *p.Int32Slice()
 	for _, v := range s {
-		b = wire.AppendVarint(b, f.wiretag)
-		b = wire.AppendVarint(b, wire.EncodeZigZag(int64(v)))
+		b = protowire.AppendVarint(b, f.wiretag)
+		b = protowire.AppendVarint(b, protowire.EncodeZigZag(int64(v)))
 	}
 	return b, nil
 }
 
 // consumeSint32Slice wire decodes a []int32 pointer as a repeated Sint32.
-func consumeSint32Slice(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+func consumeSint32Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
 	sp := p.Int32Slice()
-	if wtyp == wire.BytesType {
+	if wtyp == protowire.BytesType {
 		s := *sp
-		b, n := wire.ConsumeBytes(b)
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return out, wire.ParseError(n)
+			return out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
 			var v uint64
@@ -1153,19 +1153,19 @@
 				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 				n = 2
 			} else {
-				v, n = wire.ConsumeVarint(b)
+				v, n = protowire.ConsumeVarint(b)
 			}
 			if n < 0 {
-				return out, wire.ParseError(n)
+				return out, protowire.ParseError(n)
 			}
-			s = append(s, int32(wire.DecodeZigZag(v&math.MaxUint32)))
+			s = append(s, int32(protowire.DecodeZigZag(v&math.MaxUint32)))
 			b = b[n:]
 		}
 		*sp = s
 		out.n = n
 		return out, nil
 	}
-	if wtyp != wire.VarintType {
+	if wtyp != protowire.VarintType {
 		return out, errUnknown
 	}
 	var v uint64
@@ -1177,12 +1177,12 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
-	*sp = append(*sp, int32(wire.DecodeZigZag(v&math.MaxUint32)))
+	*sp = append(*sp, int32(protowire.DecodeZigZag(v&math.MaxUint32)))
 	out.n = n
 	return out, nil
 }
@@ -1202,9 +1202,9 @@
 	}
 	n := 0
 	for _, v := range s {
-		n += wire.SizeVarint(wire.EncodeZigZag(int64(v)))
+		n += protowire.SizeVarint(protowire.EncodeZigZag(int64(v)))
 	}
-	return f.tagsize + wire.SizeBytes(n)
+	return f.tagsize + protowire.SizeBytes(n)
 }
 
 // appendSint32PackedSlice encodes a []int32 pointer as a packed repeated Sint32.
@@ -1213,14 +1213,14 @@
 	if len(s) == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, f.wiretag)
 	n := 0
 	for _, v := range s {
-		n += wire.SizeVarint(wire.EncodeZigZag(int64(v)))
+		n += protowire.SizeVarint(protowire.EncodeZigZag(int64(v)))
 	}
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, uint64(n))
 	for _, v := range s {
-		b = wire.AppendVarint(b, wire.EncodeZigZag(int64(v)))
+		b = protowire.AppendVarint(b, protowire.EncodeZigZag(int64(v)))
 	}
 	return b, nil
 }
@@ -1234,19 +1234,19 @@
 
 // sizeSint32Value returns the size of wire encoding a int32 value as a Sint32.
 func sizeSint32Value(v protoreflect.Value, tagsize int, _ marshalOptions) int {
-	return tagsize + wire.SizeVarint(wire.EncodeZigZag(int64(int32(v.Int()))))
+	return tagsize + protowire.SizeVarint(protowire.EncodeZigZag(int64(int32(v.Int()))))
 }
 
 // appendSint32Value encodes a int32 value as a Sint32.
 func appendSint32Value(b []byte, v protoreflect.Value, wiretag uint64, _ marshalOptions) ([]byte, error) {
-	b = wire.AppendVarint(b, wiretag)
-	b = wire.AppendVarint(b, wire.EncodeZigZag(int64(int32(v.Int()))))
+	b = protowire.AppendVarint(b, wiretag)
+	b = protowire.AppendVarint(b, protowire.EncodeZigZag(int64(int32(v.Int()))))
 	return b, nil
 }
 
 // consumeSint32Value decodes a int32 value as a Sint32.
-func consumeSint32Value(b []byte, _ protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
-	if wtyp != wire.VarintType {
+func consumeSint32Value(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+	if wtyp != protowire.VarintType {
 		return protoreflect.Value{}, out, errUnknown
 	}
 	var v uint64
@@ -1258,13 +1258,13 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	out.n = n
-	return protoreflect.ValueOfInt32(int32(wire.DecodeZigZag(v & math.MaxUint32))), out, nil
+	return protoreflect.ValueOfInt32(int32(protowire.DecodeZigZag(v & math.MaxUint32))), out, nil
 }
 
 var coderSint32Value = valueCoderFuncs{
@@ -1279,7 +1279,7 @@
 	list := listv.List()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		v := list.Get(i)
-		size += tagsize + wire.SizeVarint(wire.EncodeZigZag(int64(int32(v.Int()))))
+		size += tagsize + protowire.SizeVarint(protowire.EncodeZigZag(int64(int32(v.Int()))))
 	}
 	return size
 }
@@ -1289,19 +1289,19 @@
 	list := listv.List()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendVarint(b, wiretag)
-		b = wire.AppendVarint(b, wire.EncodeZigZag(int64(int32(v.Int()))))
+		b = protowire.AppendVarint(b, wiretag)
+		b = protowire.AppendVarint(b, protowire.EncodeZigZag(int64(int32(v.Int()))))
 	}
 	return b, nil
 }
 
 // consumeSint32SliceValue wire decodes a []int32 value as a repeated Sint32.
-func consumeSint32SliceValue(b []byte, listv protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+func consumeSint32SliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
 	list := listv.List()
-	if wtyp == wire.BytesType {
-		b, n := wire.ConsumeBytes(b)
+	if wtyp == protowire.BytesType {
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return protoreflect.Value{}, out, wire.ParseError(n)
+			return protoreflect.Value{}, out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
 			var v uint64
@@ -1313,18 +1313,18 @@
 				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 				n = 2
 			} else {
-				v, n = wire.ConsumeVarint(b)
+				v, n = protowire.ConsumeVarint(b)
 			}
 			if n < 0 {
-				return protoreflect.Value{}, out, wire.ParseError(n)
+				return protoreflect.Value{}, out, protowire.ParseError(n)
 			}
-			list.Append(protoreflect.ValueOfInt32(int32(wire.DecodeZigZag(v & math.MaxUint32))))
+			list.Append(protoreflect.ValueOfInt32(int32(protowire.DecodeZigZag(v & math.MaxUint32))))
 			b = b[n:]
 		}
 		out.n = n
 		return listv, out, nil
 	}
-	if wtyp != wire.VarintType {
+	if wtyp != protowire.VarintType {
 		return protoreflect.Value{}, out, errUnknown
 	}
 	var v uint64
@@ -1336,12 +1336,12 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
-	list.Append(protoreflect.ValueOfInt32(int32(wire.DecodeZigZag(v & math.MaxUint32))))
+	list.Append(protoreflect.ValueOfInt32(int32(protowire.DecodeZigZag(v & math.MaxUint32))))
 	out.n = n
 	return listv, out, nil
 }
@@ -1363,9 +1363,9 @@
 	n := 0
 	for i, llen := 0, llen; i < llen; i++ {
 		v := list.Get(i)
-		n += wire.SizeVarint(wire.EncodeZigZag(int64(int32(v.Int()))))
+		n += protowire.SizeVarint(protowire.EncodeZigZag(int64(int32(v.Int()))))
 	}
-	return tagsize + wire.SizeBytes(n)
+	return tagsize + protowire.SizeBytes(n)
 }
 
 // appendSint32PackedSliceValue encodes a []int32 value as a packed repeated Sint32.
@@ -1375,16 +1375,16 @@
 	if llen == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, wiretag)
+	b = protowire.AppendVarint(b, wiretag)
 	n := 0
 	for i := 0; i < llen; i++ {
 		v := list.Get(i)
-		n += wire.SizeVarint(wire.EncodeZigZag(int64(int32(v.Int()))))
+		n += protowire.SizeVarint(protowire.EncodeZigZag(int64(int32(v.Int()))))
 	}
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, uint64(n))
 	for i := 0; i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendVarint(b, wire.EncodeZigZag(int64(int32(v.Int()))))
+		b = protowire.AppendVarint(b, protowire.EncodeZigZag(int64(int32(v.Int()))))
 	}
 	return b, nil
 }
@@ -1399,20 +1399,20 @@
 // sizeUint32 returns the size of wire encoding a uint32 pointer as a Uint32.
 func sizeUint32(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	v := *p.Uint32()
-	return f.tagsize + wire.SizeVarint(uint64(v))
+	return f.tagsize + protowire.SizeVarint(uint64(v))
 }
 
 // appendUint32 wire encodes a uint32 pointer as a Uint32.
 func appendUint32(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := *p.Uint32()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendVarint(b, uint64(v))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, uint64(v))
 	return b, nil
 }
 
 // consumeUint32 wire decodes a uint32 pointer as a Uint32.
-func consumeUint32(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.VarintType {
+func consumeUint32(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.VarintType {
 		return out, errUnknown
 	}
 	var v uint64
@@ -1424,10 +1424,10 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	*p.Uint32() = uint32(v)
 	out.n = n
@@ -1448,7 +1448,7 @@
 	if v == 0 {
 		return 0
 	}
-	return f.tagsize + wire.SizeVarint(uint64(v))
+	return f.tagsize + protowire.SizeVarint(uint64(v))
 }
 
 // appendUint32NoZero wire encodes a uint32 pointer as a Uint32.
@@ -1458,8 +1458,8 @@
 	if v == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendVarint(b, uint64(v))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, uint64(v))
 	return b, nil
 }
 
@@ -1474,21 +1474,21 @@
 // It panics if the pointer is nil.
 func sizeUint32Ptr(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	v := **p.Uint32Ptr()
-	return f.tagsize + wire.SizeVarint(uint64(v))
+	return f.tagsize + protowire.SizeVarint(uint64(v))
 }
 
 // appendUint32Ptr wire encodes a *uint32 pointer as a Uint32.
 // It panics if the pointer is nil.
 func appendUint32Ptr(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := **p.Uint32Ptr()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendVarint(b, uint64(v))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, uint64(v))
 	return b, nil
 }
 
 // consumeUint32Ptr wire decodes a *uint32 pointer as a Uint32.
-func consumeUint32Ptr(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.VarintType {
+func consumeUint32Ptr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.VarintType {
 		return out, errUnknown
 	}
 	var v uint64
@@ -1500,10 +1500,10 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	vp := p.Uint32Ptr()
 	if *vp == nil {
@@ -1525,7 +1525,7 @@
 func sizeUint32Slice(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	s := *p.Uint32Slice()
 	for _, v := range s {
-		size += f.tagsize + wire.SizeVarint(uint64(v))
+		size += f.tagsize + protowire.SizeVarint(uint64(v))
 	}
 	return size
 }
@@ -1534,20 +1534,20 @@
 func appendUint32Slice(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	s := *p.Uint32Slice()
 	for _, v := range s {
-		b = wire.AppendVarint(b, f.wiretag)
-		b = wire.AppendVarint(b, uint64(v))
+		b = protowire.AppendVarint(b, f.wiretag)
+		b = protowire.AppendVarint(b, uint64(v))
 	}
 	return b, nil
 }
 
 // consumeUint32Slice wire decodes a []uint32 pointer as a repeated Uint32.
-func consumeUint32Slice(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+func consumeUint32Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
 	sp := p.Uint32Slice()
-	if wtyp == wire.BytesType {
+	if wtyp == protowire.BytesType {
 		s := *sp
-		b, n := wire.ConsumeBytes(b)
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return out, wire.ParseError(n)
+			return out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
 			var v uint64
@@ -1559,10 +1559,10 @@
 				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 				n = 2
 			} else {
-				v, n = wire.ConsumeVarint(b)
+				v, n = protowire.ConsumeVarint(b)
 			}
 			if n < 0 {
-				return out, wire.ParseError(n)
+				return out, protowire.ParseError(n)
 			}
 			s = append(s, uint32(v))
 			b = b[n:]
@@ -1571,7 +1571,7 @@
 		out.n = n
 		return out, nil
 	}
-	if wtyp != wire.VarintType {
+	if wtyp != protowire.VarintType {
 		return out, errUnknown
 	}
 	var v uint64
@@ -1583,10 +1583,10 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	*sp = append(*sp, uint32(v))
 	out.n = n
@@ -1608,9 +1608,9 @@
 	}
 	n := 0
 	for _, v := range s {
-		n += wire.SizeVarint(uint64(v))
+		n += protowire.SizeVarint(uint64(v))
 	}
-	return f.tagsize + wire.SizeBytes(n)
+	return f.tagsize + protowire.SizeBytes(n)
 }
 
 // appendUint32PackedSlice encodes a []uint32 pointer as a packed repeated Uint32.
@@ -1619,14 +1619,14 @@
 	if len(s) == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, f.wiretag)
 	n := 0
 	for _, v := range s {
-		n += wire.SizeVarint(uint64(v))
+		n += protowire.SizeVarint(uint64(v))
 	}
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, uint64(n))
 	for _, v := range s {
-		b = wire.AppendVarint(b, uint64(v))
+		b = protowire.AppendVarint(b, uint64(v))
 	}
 	return b, nil
 }
@@ -1640,19 +1640,19 @@
 
 // sizeUint32Value returns the size of wire encoding a uint32 value as a Uint32.
 func sizeUint32Value(v protoreflect.Value, tagsize int, _ marshalOptions) int {
-	return tagsize + wire.SizeVarint(uint64(uint32(v.Uint())))
+	return tagsize + protowire.SizeVarint(uint64(uint32(v.Uint())))
 }
 
 // appendUint32Value encodes a uint32 value as a Uint32.
 func appendUint32Value(b []byte, v protoreflect.Value, wiretag uint64, _ marshalOptions) ([]byte, error) {
-	b = wire.AppendVarint(b, wiretag)
-	b = wire.AppendVarint(b, uint64(uint32(v.Uint())))
+	b = protowire.AppendVarint(b, wiretag)
+	b = protowire.AppendVarint(b, uint64(uint32(v.Uint())))
 	return b, nil
 }
 
 // consumeUint32Value decodes a uint32 value as a Uint32.
-func consumeUint32Value(b []byte, _ protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
-	if wtyp != wire.VarintType {
+func consumeUint32Value(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+	if wtyp != protowire.VarintType {
 		return protoreflect.Value{}, out, errUnknown
 	}
 	var v uint64
@@ -1664,10 +1664,10 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	out.n = n
 	return protoreflect.ValueOfUint32(uint32(v)), out, nil
@@ -1685,7 +1685,7 @@
 	list := listv.List()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		v := list.Get(i)
-		size += tagsize + wire.SizeVarint(uint64(uint32(v.Uint())))
+		size += tagsize + protowire.SizeVarint(uint64(uint32(v.Uint())))
 	}
 	return size
 }
@@ -1695,19 +1695,19 @@
 	list := listv.List()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendVarint(b, wiretag)
-		b = wire.AppendVarint(b, uint64(uint32(v.Uint())))
+		b = protowire.AppendVarint(b, wiretag)
+		b = protowire.AppendVarint(b, uint64(uint32(v.Uint())))
 	}
 	return b, nil
 }
 
 // consumeUint32SliceValue wire decodes a []uint32 value as a repeated Uint32.
-func consumeUint32SliceValue(b []byte, listv protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+func consumeUint32SliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
 	list := listv.List()
-	if wtyp == wire.BytesType {
-		b, n := wire.ConsumeBytes(b)
+	if wtyp == protowire.BytesType {
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return protoreflect.Value{}, out, wire.ParseError(n)
+			return protoreflect.Value{}, out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
 			var v uint64
@@ -1719,10 +1719,10 @@
 				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 				n = 2
 			} else {
-				v, n = wire.ConsumeVarint(b)
+				v, n = protowire.ConsumeVarint(b)
 			}
 			if n < 0 {
-				return protoreflect.Value{}, out, wire.ParseError(n)
+				return protoreflect.Value{}, out, protowire.ParseError(n)
 			}
 			list.Append(protoreflect.ValueOfUint32(uint32(v)))
 			b = b[n:]
@@ -1730,7 +1730,7 @@
 		out.n = n
 		return listv, out, nil
 	}
-	if wtyp != wire.VarintType {
+	if wtyp != protowire.VarintType {
 		return protoreflect.Value{}, out, errUnknown
 	}
 	var v uint64
@@ -1742,10 +1742,10 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	list.Append(protoreflect.ValueOfUint32(uint32(v)))
 	out.n = n
@@ -1769,9 +1769,9 @@
 	n := 0
 	for i, llen := 0, llen; i < llen; i++ {
 		v := list.Get(i)
-		n += wire.SizeVarint(uint64(uint32(v.Uint())))
+		n += protowire.SizeVarint(uint64(uint32(v.Uint())))
 	}
-	return tagsize + wire.SizeBytes(n)
+	return tagsize + protowire.SizeBytes(n)
 }
 
 // appendUint32PackedSliceValue encodes a []uint32 value as a packed repeated Uint32.
@@ -1781,16 +1781,16 @@
 	if llen == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, wiretag)
+	b = protowire.AppendVarint(b, wiretag)
 	n := 0
 	for i := 0; i < llen; i++ {
 		v := list.Get(i)
-		n += wire.SizeVarint(uint64(uint32(v.Uint())))
+		n += protowire.SizeVarint(uint64(uint32(v.Uint())))
 	}
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, uint64(n))
 	for i := 0; i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendVarint(b, uint64(uint32(v.Uint())))
+		b = protowire.AppendVarint(b, uint64(uint32(v.Uint())))
 	}
 	return b, nil
 }
@@ -1805,20 +1805,20 @@
 // sizeInt64 returns the size of wire encoding a int64 pointer as a Int64.
 func sizeInt64(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	v := *p.Int64()
-	return f.tagsize + wire.SizeVarint(uint64(v))
+	return f.tagsize + protowire.SizeVarint(uint64(v))
 }
 
 // appendInt64 wire encodes a int64 pointer as a Int64.
 func appendInt64(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := *p.Int64()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendVarint(b, uint64(v))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, uint64(v))
 	return b, nil
 }
 
 // consumeInt64 wire decodes a int64 pointer as a Int64.
-func consumeInt64(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.VarintType {
+func consumeInt64(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.VarintType {
 		return out, errUnknown
 	}
 	var v uint64
@@ -1830,10 +1830,10 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	*p.Int64() = int64(v)
 	out.n = n
@@ -1854,7 +1854,7 @@
 	if v == 0 {
 		return 0
 	}
-	return f.tagsize + wire.SizeVarint(uint64(v))
+	return f.tagsize + protowire.SizeVarint(uint64(v))
 }
 
 // appendInt64NoZero wire encodes a int64 pointer as a Int64.
@@ -1864,8 +1864,8 @@
 	if v == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendVarint(b, uint64(v))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, uint64(v))
 	return b, nil
 }
 
@@ -1880,21 +1880,21 @@
 // It panics if the pointer is nil.
 func sizeInt64Ptr(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	v := **p.Int64Ptr()
-	return f.tagsize + wire.SizeVarint(uint64(v))
+	return f.tagsize + protowire.SizeVarint(uint64(v))
 }
 
 // appendInt64Ptr wire encodes a *int64 pointer as a Int64.
 // It panics if the pointer is nil.
 func appendInt64Ptr(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := **p.Int64Ptr()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendVarint(b, uint64(v))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, uint64(v))
 	return b, nil
 }
 
 // consumeInt64Ptr wire decodes a *int64 pointer as a Int64.
-func consumeInt64Ptr(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.VarintType {
+func consumeInt64Ptr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.VarintType {
 		return out, errUnknown
 	}
 	var v uint64
@@ -1906,10 +1906,10 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	vp := p.Int64Ptr()
 	if *vp == nil {
@@ -1931,7 +1931,7 @@
 func sizeInt64Slice(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	s := *p.Int64Slice()
 	for _, v := range s {
-		size += f.tagsize + wire.SizeVarint(uint64(v))
+		size += f.tagsize + protowire.SizeVarint(uint64(v))
 	}
 	return size
 }
@@ -1940,20 +1940,20 @@
 func appendInt64Slice(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	s := *p.Int64Slice()
 	for _, v := range s {
-		b = wire.AppendVarint(b, f.wiretag)
-		b = wire.AppendVarint(b, uint64(v))
+		b = protowire.AppendVarint(b, f.wiretag)
+		b = protowire.AppendVarint(b, uint64(v))
 	}
 	return b, nil
 }
 
 // consumeInt64Slice wire decodes a []int64 pointer as a repeated Int64.
-func consumeInt64Slice(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+func consumeInt64Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
 	sp := p.Int64Slice()
-	if wtyp == wire.BytesType {
+	if wtyp == protowire.BytesType {
 		s := *sp
-		b, n := wire.ConsumeBytes(b)
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return out, wire.ParseError(n)
+			return out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
 			var v uint64
@@ -1965,10 +1965,10 @@
 				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 				n = 2
 			} else {
-				v, n = wire.ConsumeVarint(b)
+				v, n = protowire.ConsumeVarint(b)
 			}
 			if n < 0 {
-				return out, wire.ParseError(n)
+				return out, protowire.ParseError(n)
 			}
 			s = append(s, int64(v))
 			b = b[n:]
@@ -1977,7 +1977,7 @@
 		out.n = n
 		return out, nil
 	}
-	if wtyp != wire.VarintType {
+	if wtyp != protowire.VarintType {
 		return out, errUnknown
 	}
 	var v uint64
@@ -1989,10 +1989,10 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	*sp = append(*sp, int64(v))
 	out.n = n
@@ -2014,9 +2014,9 @@
 	}
 	n := 0
 	for _, v := range s {
-		n += wire.SizeVarint(uint64(v))
+		n += protowire.SizeVarint(uint64(v))
 	}
-	return f.tagsize + wire.SizeBytes(n)
+	return f.tagsize + protowire.SizeBytes(n)
 }
 
 // appendInt64PackedSlice encodes a []int64 pointer as a packed repeated Int64.
@@ -2025,14 +2025,14 @@
 	if len(s) == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, f.wiretag)
 	n := 0
 	for _, v := range s {
-		n += wire.SizeVarint(uint64(v))
+		n += protowire.SizeVarint(uint64(v))
 	}
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, uint64(n))
 	for _, v := range s {
-		b = wire.AppendVarint(b, uint64(v))
+		b = protowire.AppendVarint(b, uint64(v))
 	}
 	return b, nil
 }
@@ -2046,19 +2046,19 @@
 
 // sizeInt64Value returns the size of wire encoding a int64 value as a Int64.
 func sizeInt64Value(v protoreflect.Value, tagsize int, _ marshalOptions) int {
-	return tagsize + wire.SizeVarint(uint64(v.Int()))
+	return tagsize + protowire.SizeVarint(uint64(v.Int()))
 }
 
 // appendInt64Value encodes a int64 value as a Int64.
 func appendInt64Value(b []byte, v protoreflect.Value, wiretag uint64, _ marshalOptions) ([]byte, error) {
-	b = wire.AppendVarint(b, wiretag)
-	b = wire.AppendVarint(b, uint64(v.Int()))
+	b = protowire.AppendVarint(b, wiretag)
+	b = protowire.AppendVarint(b, uint64(v.Int()))
 	return b, nil
 }
 
 // consumeInt64Value decodes a int64 value as a Int64.
-func consumeInt64Value(b []byte, _ protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
-	if wtyp != wire.VarintType {
+func consumeInt64Value(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+	if wtyp != protowire.VarintType {
 		return protoreflect.Value{}, out, errUnknown
 	}
 	var v uint64
@@ -2070,10 +2070,10 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	out.n = n
 	return protoreflect.ValueOfInt64(int64(v)), out, nil
@@ -2091,7 +2091,7 @@
 	list := listv.List()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		v := list.Get(i)
-		size += tagsize + wire.SizeVarint(uint64(v.Int()))
+		size += tagsize + protowire.SizeVarint(uint64(v.Int()))
 	}
 	return size
 }
@@ -2101,19 +2101,19 @@
 	list := listv.List()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendVarint(b, wiretag)
-		b = wire.AppendVarint(b, uint64(v.Int()))
+		b = protowire.AppendVarint(b, wiretag)
+		b = protowire.AppendVarint(b, uint64(v.Int()))
 	}
 	return b, nil
 }
 
 // consumeInt64SliceValue wire decodes a []int64 value as a repeated Int64.
-func consumeInt64SliceValue(b []byte, listv protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+func consumeInt64SliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
 	list := listv.List()
-	if wtyp == wire.BytesType {
-		b, n := wire.ConsumeBytes(b)
+	if wtyp == protowire.BytesType {
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return protoreflect.Value{}, out, wire.ParseError(n)
+			return protoreflect.Value{}, out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
 			var v uint64
@@ -2125,10 +2125,10 @@
 				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 				n = 2
 			} else {
-				v, n = wire.ConsumeVarint(b)
+				v, n = protowire.ConsumeVarint(b)
 			}
 			if n < 0 {
-				return protoreflect.Value{}, out, wire.ParseError(n)
+				return protoreflect.Value{}, out, protowire.ParseError(n)
 			}
 			list.Append(protoreflect.ValueOfInt64(int64(v)))
 			b = b[n:]
@@ -2136,7 +2136,7 @@
 		out.n = n
 		return listv, out, nil
 	}
-	if wtyp != wire.VarintType {
+	if wtyp != protowire.VarintType {
 		return protoreflect.Value{}, out, errUnknown
 	}
 	var v uint64
@@ -2148,10 +2148,10 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	list.Append(protoreflect.ValueOfInt64(int64(v)))
 	out.n = n
@@ -2175,9 +2175,9 @@
 	n := 0
 	for i, llen := 0, llen; i < llen; i++ {
 		v := list.Get(i)
-		n += wire.SizeVarint(uint64(v.Int()))
+		n += protowire.SizeVarint(uint64(v.Int()))
 	}
-	return tagsize + wire.SizeBytes(n)
+	return tagsize + protowire.SizeBytes(n)
 }
 
 // appendInt64PackedSliceValue encodes a []int64 value as a packed repeated Int64.
@@ -2187,16 +2187,16 @@
 	if llen == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, wiretag)
+	b = protowire.AppendVarint(b, wiretag)
 	n := 0
 	for i := 0; i < llen; i++ {
 		v := list.Get(i)
-		n += wire.SizeVarint(uint64(v.Int()))
+		n += protowire.SizeVarint(uint64(v.Int()))
 	}
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, uint64(n))
 	for i := 0; i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendVarint(b, uint64(v.Int()))
+		b = protowire.AppendVarint(b, uint64(v.Int()))
 	}
 	return b, nil
 }
@@ -2211,20 +2211,20 @@
 // sizeSint64 returns the size of wire encoding a int64 pointer as a Sint64.
 func sizeSint64(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	v := *p.Int64()
-	return f.tagsize + wire.SizeVarint(wire.EncodeZigZag(v))
+	return f.tagsize + protowire.SizeVarint(protowire.EncodeZigZag(v))
 }
 
 // appendSint64 wire encodes a int64 pointer as a Sint64.
 func appendSint64(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := *p.Int64()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendVarint(b, wire.EncodeZigZag(v))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, protowire.EncodeZigZag(v))
 	return b, nil
 }
 
 // consumeSint64 wire decodes a int64 pointer as a Sint64.
-func consumeSint64(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.VarintType {
+func consumeSint64(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.VarintType {
 		return out, errUnknown
 	}
 	var v uint64
@@ -2236,12 +2236,12 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
-	*p.Int64() = wire.DecodeZigZag(v)
+	*p.Int64() = protowire.DecodeZigZag(v)
 	out.n = n
 	return out, nil
 }
@@ -2260,7 +2260,7 @@
 	if v == 0 {
 		return 0
 	}
-	return f.tagsize + wire.SizeVarint(wire.EncodeZigZag(v))
+	return f.tagsize + protowire.SizeVarint(protowire.EncodeZigZag(v))
 }
 
 // appendSint64NoZero wire encodes a int64 pointer as a Sint64.
@@ -2270,8 +2270,8 @@
 	if v == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendVarint(b, wire.EncodeZigZag(v))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, protowire.EncodeZigZag(v))
 	return b, nil
 }
 
@@ -2286,21 +2286,21 @@
 // It panics if the pointer is nil.
 func sizeSint64Ptr(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	v := **p.Int64Ptr()
-	return f.tagsize + wire.SizeVarint(wire.EncodeZigZag(v))
+	return f.tagsize + protowire.SizeVarint(protowire.EncodeZigZag(v))
 }
 
 // appendSint64Ptr wire encodes a *int64 pointer as a Sint64.
 // It panics if the pointer is nil.
 func appendSint64Ptr(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := **p.Int64Ptr()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendVarint(b, wire.EncodeZigZag(v))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, protowire.EncodeZigZag(v))
 	return b, nil
 }
 
 // consumeSint64Ptr wire decodes a *int64 pointer as a Sint64.
-func consumeSint64Ptr(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.VarintType {
+func consumeSint64Ptr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.VarintType {
 		return out, errUnknown
 	}
 	var v uint64
@@ -2312,16 +2312,16 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	vp := p.Int64Ptr()
 	if *vp == nil {
 		*vp = new(int64)
 	}
-	**vp = wire.DecodeZigZag(v)
+	**vp = protowire.DecodeZigZag(v)
 	out.n = n
 	return out, nil
 }
@@ -2337,7 +2337,7 @@
 func sizeSint64Slice(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	s := *p.Int64Slice()
 	for _, v := range s {
-		size += f.tagsize + wire.SizeVarint(wire.EncodeZigZag(v))
+		size += f.tagsize + protowire.SizeVarint(protowire.EncodeZigZag(v))
 	}
 	return size
 }
@@ -2346,20 +2346,20 @@
 func appendSint64Slice(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	s := *p.Int64Slice()
 	for _, v := range s {
-		b = wire.AppendVarint(b, f.wiretag)
-		b = wire.AppendVarint(b, wire.EncodeZigZag(v))
+		b = protowire.AppendVarint(b, f.wiretag)
+		b = protowire.AppendVarint(b, protowire.EncodeZigZag(v))
 	}
 	return b, nil
 }
 
 // consumeSint64Slice wire decodes a []int64 pointer as a repeated Sint64.
-func consumeSint64Slice(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+func consumeSint64Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
 	sp := p.Int64Slice()
-	if wtyp == wire.BytesType {
+	if wtyp == protowire.BytesType {
 		s := *sp
-		b, n := wire.ConsumeBytes(b)
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return out, wire.ParseError(n)
+			return out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
 			var v uint64
@@ -2371,19 +2371,19 @@
 				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 				n = 2
 			} else {
-				v, n = wire.ConsumeVarint(b)
+				v, n = protowire.ConsumeVarint(b)
 			}
 			if n < 0 {
-				return out, wire.ParseError(n)
+				return out, protowire.ParseError(n)
 			}
-			s = append(s, wire.DecodeZigZag(v))
+			s = append(s, protowire.DecodeZigZag(v))
 			b = b[n:]
 		}
 		*sp = s
 		out.n = n
 		return out, nil
 	}
-	if wtyp != wire.VarintType {
+	if wtyp != protowire.VarintType {
 		return out, errUnknown
 	}
 	var v uint64
@@ -2395,12 +2395,12 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
-	*sp = append(*sp, wire.DecodeZigZag(v))
+	*sp = append(*sp, protowire.DecodeZigZag(v))
 	out.n = n
 	return out, nil
 }
@@ -2420,9 +2420,9 @@
 	}
 	n := 0
 	for _, v := range s {
-		n += wire.SizeVarint(wire.EncodeZigZag(v))
+		n += protowire.SizeVarint(protowire.EncodeZigZag(v))
 	}
-	return f.tagsize + wire.SizeBytes(n)
+	return f.tagsize + protowire.SizeBytes(n)
 }
 
 // appendSint64PackedSlice encodes a []int64 pointer as a packed repeated Sint64.
@@ -2431,14 +2431,14 @@
 	if len(s) == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, f.wiretag)
 	n := 0
 	for _, v := range s {
-		n += wire.SizeVarint(wire.EncodeZigZag(v))
+		n += protowire.SizeVarint(protowire.EncodeZigZag(v))
 	}
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, uint64(n))
 	for _, v := range s {
-		b = wire.AppendVarint(b, wire.EncodeZigZag(v))
+		b = protowire.AppendVarint(b, protowire.EncodeZigZag(v))
 	}
 	return b, nil
 }
@@ -2452,19 +2452,19 @@
 
 // sizeSint64Value returns the size of wire encoding a int64 value as a Sint64.
 func sizeSint64Value(v protoreflect.Value, tagsize int, _ marshalOptions) int {
-	return tagsize + wire.SizeVarint(wire.EncodeZigZag(v.Int()))
+	return tagsize + protowire.SizeVarint(protowire.EncodeZigZag(v.Int()))
 }
 
 // appendSint64Value encodes a int64 value as a Sint64.
 func appendSint64Value(b []byte, v protoreflect.Value, wiretag uint64, _ marshalOptions) ([]byte, error) {
-	b = wire.AppendVarint(b, wiretag)
-	b = wire.AppendVarint(b, wire.EncodeZigZag(v.Int()))
+	b = protowire.AppendVarint(b, wiretag)
+	b = protowire.AppendVarint(b, protowire.EncodeZigZag(v.Int()))
 	return b, nil
 }
 
 // consumeSint64Value decodes a int64 value as a Sint64.
-func consumeSint64Value(b []byte, _ protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
-	if wtyp != wire.VarintType {
+func consumeSint64Value(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+	if wtyp != protowire.VarintType {
 		return protoreflect.Value{}, out, errUnknown
 	}
 	var v uint64
@@ -2476,13 +2476,13 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	out.n = n
-	return protoreflect.ValueOfInt64(wire.DecodeZigZag(v)), out, nil
+	return protoreflect.ValueOfInt64(protowire.DecodeZigZag(v)), out, nil
 }
 
 var coderSint64Value = valueCoderFuncs{
@@ -2497,7 +2497,7 @@
 	list := listv.List()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		v := list.Get(i)
-		size += tagsize + wire.SizeVarint(wire.EncodeZigZag(v.Int()))
+		size += tagsize + protowire.SizeVarint(protowire.EncodeZigZag(v.Int()))
 	}
 	return size
 }
@@ -2507,19 +2507,19 @@
 	list := listv.List()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendVarint(b, wiretag)
-		b = wire.AppendVarint(b, wire.EncodeZigZag(v.Int()))
+		b = protowire.AppendVarint(b, wiretag)
+		b = protowire.AppendVarint(b, protowire.EncodeZigZag(v.Int()))
 	}
 	return b, nil
 }
 
 // consumeSint64SliceValue wire decodes a []int64 value as a repeated Sint64.
-func consumeSint64SliceValue(b []byte, listv protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+func consumeSint64SliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
 	list := listv.List()
-	if wtyp == wire.BytesType {
-		b, n := wire.ConsumeBytes(b)
+	if wtyp == protowire.BytesType {
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return protoreflect.Value{}, out, wire.ParseError(n)
+			return protoreflect.Value{}, out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
 			var v uint64
@@ -2531,18 +2531,18 @@
 				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 				n = 2
 			} else {
-				v, n = wire.ConsumeVarint(b)
+				v, n = protowire.ConsumeVarint(b)
 			}
 			if n < 0 {
-				return protoreflect.Value{}, out, wire.ParseError(n)
+				return protoreflect.Value{}, out, protowire.ParseError(n)
 			}
-			list.Append(protoreflect.ValueOfInt64(wire.DecodeZigZag(v)))
+			list.Append(protoreflect.ValueOfInt64(protowire.DecodeZigZag(v)))
 			b = b[n:]
 		}
 		out.n = n
 		return listv, out, nil
 	}
-	if wtyp != wire.VarintType {
+	if wtyp != protowire.VarintType {
 		return protoreflect.Value{}, out, errUnknown
 	}
 	var v uint64
@@ -2554,12 +2554,12 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
-	list.Append(protoreflect.ValueOfInt64(wire.DecodeZigZag(v)))
+	list.Append(protoreflect.ValueOfInt64(protowire.DecodeZigZag(v)))
 	out.n = n
 	return listv, out, nil
 }
@@ -2581,9 +2581,9 @@
 	n := 0
 	for i, llen := 0, llen; i < llen; i++ {
 		v := list.Get(i)
-		n += wire.SizeVarint(wire.EncodeZigZag(v.Int()))
+		n += protowire.SizeVarint(protowire.EncodeZigZag(v.Int()))
 	}
-	return tagsize + wire.SizeBytes(n)
+	return tagsize + protowire.SizeBytes(n)
 }
 
 // appendSint64PackedSliceValue encodes a []int64 value as a packed repeated Sint64.
@@ -2593,16 +2593,16 @@
 	if llen == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, wiretag)
+	b = protowire.AppendVarint(b, wiretag)
 	n := 0
 	for i := 0; i < llen; i++ {
 		v := list.Get(i)
-		n += wire.SizeVarint(wire.EncodeZigZag(v.Int()))
+		n += protowire.SizeVarint(protowire.EncodeZigZag(v.Int()))
 	}
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, uint64(n))
 	for i := 0; i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendVarint(b, wire.EncodeZigZag(v.Int()))
+		b = protowire.AppendVarint(b, protowire.EncodeZigZag(v.Int()))
 	}
 	return b, nil
 }
@@ -2617,20 +2617,20 @@
 // sizeUint64 returns the size of wire encoding a uint64 pointer as a Uint64.
 func sizeUint64(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	v := *p.Uint64()
-	return f.tagsize + wire.SizeVarint(v)
+	return f.tagsize + protowire.SizeVarint(v)
 }
 
 // appendUint64 wire encodes a uint64 pointer as a Uint64.
 func appendUint64(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := *p.Uint64()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendVarint(b, v)
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, v)
 	return b, nil
 }
 
 // consumeUint64 wire decodes a uint64 pointer as a Uint64.
-func consumeUint64(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.VarintType {
+func consumeUint64(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.VarintType {
 		return out, errUnknown
 	}
 	var v uint64
@@ -2642,10 +2642,10 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	*p.Uint64() = v
 	out.n = n
@@ -2666,7 +2666,7 @@
 	if v == 0 {
 		return 0
 	}
-	return f.tagsize + wire.SizeVarint(v)
+	return f.tagsize + protowire.SizeVarint(v)
 }
 
 // appendUint64NoZero wire encodes a uint64 pointer as a Uint64.
@@ -2676,8 +2676,8 @@
 	if v == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendVarint(b, v)
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, v)
 	return b, nil
 }
 
@@ -2692,21 +2692,21 @@
 // It panics if the pointer is nil.
 func sizeUint64Ptr(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	v := **p.Uint64Ptr()
-	return f.tagsize + wire.SizeVarint(v)
+	return f.tagsize + protowire.SizeVarint(v)
 }
 
 // appendUint64Ptr wire encodes a *uint64 pointer as a Uint64.
 // It panics if the pointer is nil.
 func appendUint64Ptr(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := **p.Uint64Ptr()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendVarint(b, v)
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, v)
 	return b, nil
 }
 
 // consumeUint64Ptr wire decodes a *uint64 pointer as a Uint64.
-func consumeUint64Ptr(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.VarintType {
+func consumeUint64Ptr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.VarintType {
 		return out, errUnknown
 	}
 	var v uint64
@@ -2718,10 +2718,10 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	vp := p.Uint64Ptr()
 	if *vp == nil {
@@ -2743,7 +2743,7 @@
 func sizeUint64Slice(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	s := *p.Uint64Slice()
 	for _, v := range s {
-		size += f.tagsize + wire.SizeVarint(v)
+		size += f.tagsize + protowire.SizeVarint(v)
 	}
 	return size
 }
@@ -2752,20 +2752,20 @@
 func appendUint64Slice(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	s := *p.Uint64Slice()
 	for _, v := range s {
-		b = wire.AppendVarint(b, f.wiretag)
-		b = wire.AppendVarint(b, v)
+		b = protowire.AppendVarint(b, f.wiretag)
+		b = protowire.AppendVarint(b, v)
 	}
 	return b, nil
 }
 
 // consumeUint64Slice wire decodes a []uint64 pointer as a repeated Uint64.
-func consumeUint64Slice(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+func consumeUint64Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
 	sp := p.Uint64Slice()
-	if wtyp == wire.BytesType {
+	if wtyp == protowire.BytesType {
 		s := *sp
-		b, n := wire.ConsumeBytes(b)
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return out, wire.ParseError(n)
+			return out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
 			var v uint64
@@ -2777,10 +2777,10 @@
 				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 				n = 2
 			} else {
-				v, n = wire.ConsumeVarint(b)
+				v, n = protowire.ConsumeVarint(b)
 			}
 			if n < 0 {
-				return out, wire.ParseError(n)
+				return out, protowire.ParseError(n)
 			}
 			s = append(s, v)
 			b = b[n:]
@@ -2789,7 +2789,7 @@
 		out.n = n
 		return out, nil
 	}
-	if wtyp != wire.VarintType {
+	if wtyp != protowire.VarintType {
 		return out, errUnknown
 	}
 	var v uint64
@@ -2801,10 +2801,10 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	*sp = append(*sp, v)
 	out.n = n
@@ -2826,9 +2826,9 @@
 	}
 	n := 0
 	for _, v := range s {
-		n += wire.SizeVarint(v)
+		n += protowire.SizeVarint(v)
 	}
-	return f.tagsize + wire.SizeBytes(n)
+	return f.tagsize + protowire.SizeBytes(n)
 }
 
 // appendUint64PackedSlice encodes a []uint64 pointer as a packed repeated Uint64.
@@ -2837,14 +2837,14 @@
 	if len(s) == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, f.wiretag)
 	n := 0
 	for _, v := range s {
-		n += wire.SizeVarint(v)
+		n += protowire.SizeVarint(v)
 	}
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, uint64(n))
 	for _, v := range s {
-		b = wire.AppendVarint(b, v)
+		b = protowire.AppendVarint(b, v)
 	}
 	return b, nil
 }
@@ -2858,19 +2858,19 @@
 
 // sizeUint64Value returns the size of wire encoding a uint64 value as a Uint64.
 func sizeUint64Value(v protoreflect.Value, tagsize int, _ marshalOptions) int {
-	return tagsize + wire.SizeVarint(v.Uint())
+	return tagsize + protowire.SizeVarint(v.Uint())
 }
 
 // appendUint64Value encodes a uint64 value as a Uint64.
 func appendUint64Value(b []byte, v protoreflect.Value, wiretag uint64, _ marshalOptions) ([]byte, error) {
-	b = wire.AppendVarint(b, wiretag)
-	b = wire.AppendVarint(b, v.Uint())
+	b = protowire.AppendVarint(b, wiretag)
+	b = protowire.AppendVarint(b, v.Uint())
 	return b, nil
 }
 
 // consumeUint64Value decodes a uint64 value as a Uint64.
-func consumeUint64Value(b []byte, _ protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
-	if wtyp != wire.VarintType {
+func consumeUint64Value(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+	if wtyp != protowire.VarintType {
 		return protoreflect.Value{}, out, errUnknown
 	}
 	var v uint64
@@ -2882,10 +2882,10 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	out.n = n
 	return protoreflect.ValueOfUint64(v), out, nil
@@ -2903,7 +2903,7 @@
 	list := listv.List()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		v := list.Get(i)
-		size += tagsize + wire.SizeVarint(v.Uint())
+		size += tagsize + protowire.SizeVarint(v.Uint())
 	}
 	return size
 }
@@ -2913,19 +2913,19 @@
 	list := listv.List()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendVarint(b, wiretag)
-		b = wire.AppendVarint(b, v.Uint())
+		b = protowire.AppendVarint(b, wiretag)
+		b = protowire.AppendVarint(b, v.Uint())
 	}
 	return b, nil
 }
 
 // consumeUint64SliceValue wire decodes a []uint64 value as a repeated Uint64.
-func consumeUint64SliceValue(b []byte, listv protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+func consumeUint64SliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
 	list := listv.List()
-	if wtyp == wire.BytesType {
-		b, n := wire.ConsumeBytes(b)
+	if wtyp == protowire.BytesType {
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return protoreflect.Value{}, out, wire.ParseError(n)
+			return protoreflect.Value{}, out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
 			var v uint64
@@ -2937,10 +2937,10 @@
 				v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 				n = 2
 			} else {
-				v, n = wire.ConsumeVarint(b)
+				v, n = protowire.ConsumeVarint(b)
 			}
 			if n < 0 {
-				return protoreflect.Value{}, out, wire.ParseError(n)
+				return protoreflect.Value{}, out, protowire.ParseError(n)
 			}
 			list.Append(protoreflect.ValueOfUint64(v))
 			b = b[n:]
@@ -2948,7 +2948,7 @@
 		out.n = n
 		return listv, out, nil
 	}
-	if wtyp != wire.VarintType {
+	if wtyp != protowire.VarintType {
 		return protoreflect.Value{}, out, errUnknown
 	}
 	var v uint64
@@ -2960,10 +2960,10 @@
 		v = uint64(b[0]&0x7f) + uint64(b[1])<<7
 		n = 2
 	} else {
-		v, n = wire.ConsumeVarint(b)
+		v, n = protowire.ConsumeVarint(b)
 	}
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	list.Append(protoreflect.ValueOfUint64(v))
 	out.n = n
@@ -2987,9 +2987,9 @@
 	n := 0
 	for i, llen := 0, llen; i < llen; i++ {
 		v := list.Get(i)
-		n += wire.SizeVarint(v.Uint())
+		n += protowire.SizeVarint(v.Uint())
 	}
-	return tagsize + wire.SizeBytes(n)
+	return tagsize + protowire.SizeBytes(n)
 }
 
 // appendUint64PackedSliceValue encodes a []uint64 value as a packed repeated Uint64.
@@ -2999,16 +2999,16 @@
 	if llen == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, wiretag)
+	b = protowire.AppendVarint(b, wiretag)
 	n := 0
 	for i := 0; i < llen; i++ {
 		v := list.Get(i)
-		n += wire.SizeVarint(v.Uint())
+		n += protowire.SizeVarint(v.Uint())
 	}
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, uint64(n))
 	for i := 0; i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendVarint(b, v.Uint())
+		b = protowire.AppendVarint(b, v.Uint())
 	}
 	return b, nil
 }
@@ -3023,25 +3023,25 @@
 // sizeSfixed32 returns the size of wire encoding a int32 pointer as a Sfixed32.
 func sizeSfixed32(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 
-	return f.tagsize + wire.SizeFixed32()
+	return f.tagsize + protowire.SizeFixed32()
 }
 
 // appendSfixed32 wire encodes a int32 pointer as a Sfixed32.
 func appendSfixed32(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := *p.Int32()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendFixed32(b, uint32(v))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendFixed32(b, uint32(v))
 	return b, nil
 }
 
 // consumeSfixed32 wire decodes a int32 pointer as a Sfixed32.
-func consumeSfixed32(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.Fixed32Type {
+func consumeSfixed32(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.Fixed32Type {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeFixed32(b)
+	v, n := protowire.ConsumeFixed32(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	*p.Int32() = int32(v)
 	out.n = n
@@ -3062,7 +3062,7 @@
 	if v == 0 {
 		return 0
 	}
-	return f.tagsize + wire.SizeFixed32()
+	return f.tagsize + protowire.SizeFixed32()
 }
 
 // appendSfixed32NoZero wire encodes a int32 pointer as a Sfixed32.
@@ -3072,8 +3072,8 @@
 	if v == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendFixed32(b, uint32(v))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendFixed32(b, uint32(v))
 	return b, nil
 }
 
@@ -3087,26 +3087,26 @@
 // sizeSfixed32Ptr returns the size of wire encoding a *int32 pointer as a Sfixed32.
 // It panics if the pointer is nil.
 func sizeSfixed32Ptr(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
-	return f.tagsize + wire.SizeFixed32()
+	return f.tagsize + protowire.SizeFixed32()
 }
 
 // appendSfixed32Ptr wire encodes a *int32 pointer as a Sfixed32.
 // It panics if the pointer is nil.
 func appendSfixed32Ptr(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := **p.Int32Ptr()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendFixed32(b, uint32(v))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendFixed32(b, uint32(v))
 	return b, nil
 }
 
 // consumeSfixed32Ptr wire decodes a *int32 pointer as a Sfixed32.
-func consumeSfixed32Ptr(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.Fixed32Type {
+func consumeSfixed32Ptr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.Fixed32Type {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeFixed32(b)
+	v, n := protowire.ConsumeFixed32(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	vp := p.Int32Ptr()
 	if *vp == nil {
@@ -3127,7 +3127,7 @@
 // sizeSfixed32Slice returns the size of wire encoding a []int32 pointer as a repeated Sfixed32.
 func sizeSfixed32Slice(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	s := *p.Int32Slice()
-	size = len(s) * (f.tagsize + wire.SizeFixed32())
+	size = len(s) * (f.tagsize + protowire.SizeFixed32())
 	return size
 }
 
@@ -3135,25 +3135,25 @@
 func appendSfixed32Slice(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	s := *p.Int32Slice()
 	for _, v := range s {
-		b = wire.AppendVarint(b, f.wiretag)
-		b = wire.AppendFixed32(b, uint32(v))
+		b = protowire.AppendVarint(b, f.wiretag)
+		b = protowire.AppendFixed32(b, uint32(v))
 	}
 	return b, nil
 }
 
 // consumeSfixed32Slice wire decodes a []int32 pointer as a repeated Sfixed32.
-func consumeSfixed32Slice(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+func consumeSfixed32Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
 	sp := p.Int32Slice()
-	if wtyp == wire.BytesType {
+	if wtyp == protowire.BytesType {
 		s := *sp
-		b, n := wire.ConsumeBytes(b)
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return out, wire.ParseError(n)
+			return out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
-			v, n := wire.ConsumeFixed32(b)
+			v, n := protowire.ConsumeFixed32(b)
 			if n < 0 {
-				return out, wire.ParseError(n)
+				return out, protowire.ParseError(n)
 			}
 			s = append(s, int32(v))
 			b = b[n:]
@@ -3162,12 +3162,12 @@
 		out.n = n
 		return out, nil
 	}
-	if wtyp != wire.Fixed32Type {
+	if wtyp != protowire.Fixed32Type {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeFixed32(b)
+	v, n := protowire.ConsumeFixed32(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	*sp = append(*sp, int32(v))
 	out.n = n
@@ -3187,8 +3187,8 @@
 	if len(s) == 0 {
 		return 0
 	}
-	n := len(s) * wire.SizeFixed32()
-	return f.tagsize + wire.SizeBytes(n)
+	n := len(s) * protowire.SizeFixed32()
+	return f.tagsize + protowire.SizeBytes(n)
 }
 
 // appendSfixed32PackedSlice encodes a []int32 pointer as a packed repeated Sfixed32.
@@ -3197,11 +3197,11 @@
 	if len(s) == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
-	n := len(s) * wire.SizeFixed32()
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, f.wiretag)
+	n := len(s) * protowire.SizeFixed32()
+	b = protowire.AppendVarint(b, uint64(n))
 	for _, v := range s {
-		b = wire.AppendFixed32(b, uint32(v))
+		b = protowire.AppendFixed32(b, uint32(v))
 	}
 	return b, nil
 }
@@ -3215,24 +3215,24 @@
 
 // sizeSfixed32Value returns the size of wire encoding a int32 value as a Sfixed32.
 func sizeSfixed32Value(v protoreflect.Value, tagsize int, _ marshalOptions) int {
-	return tagsize + wire.SizeFixed32()
+	return tagsize + protowire.SizeFixed32()
 }
 
 // appendSfixed32Value encodes a int32 value as a Sfixed32.
 func appendSfixed32Value(b []byte, v protoreflect.Value, wiretag uint64, _ marshalOptions) ([]byte, error) {
-	b = wire.AppendVarint(b, wiretag)
-	b = wire.AppendFixed32(b, uint32(v.Int()))
+	b = protowire.AppendVarint(b, wiretag)
+	b = protowire.AppendFixed32(b, uint32(v.Int()))
 	return b, nil
 }
 
 // consumeSfixed32Value decodes a int32 value as a Sfixed32.
-func consumeSfixed32Value(b []byte, _ protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
-	if wtyp != wire.Fixed32Type {
+func consumeSfixed32Value(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+	if wtyp != protowire.Fixed32Type {
 		return protoreflect.Value{}, out, errUnknown
 	}
-	v, n := wire.ConsumeFixed32(b)
+	v, n := protowire.ConsumeFixed32(b)
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	out.n = n
 	return protoreflect.ValueOfInt32(int32(v)), out, nil
@@ -3248,7 +3248,7 @@
 // sizeSfixed32SliceValue returns the size of wire encoding a []int32 value as a repeated Sfixed32.
 func sizeSfixed32SliceValue(listv protoreflect.Value, tagsize int, _ marshalOptions) (size int) {
 	list := listv.List()
-	size = list.Len() * (tagsize + wire.SizeFixed32())
+	size = list.Len() * (tagsize + protowire.SizeFixed32())
 	return size
 }
 
@@ -3257,24 +3257,24 @@
 	list := listv.List()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendVarint(b, wiretag)
-		b = wire.AppendFixed32(b, uint32(v.Int()))
+		b = protowire.AppendVarint(b, wiretag)
+		b = protowire.AppendFixed32(b, uint32(v.Int()))
 	}
 	return b, nil
 }
 
 // consumeSfixed32SliceValue wire decodes a []int32 value as a repeated Sfixed32.
-func consumeSfixed32SliceValue(b []byte, listv protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+func consumeSfixed32SliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
 	list := listv.List()
-	if wtyp == wire.BytesType {
-		b, n := wire.ConsumeBytes(b)
+	if wtyp == protowire.BytesType {
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return protoreflect.Value{}, out, wire.ParseError(n)
+			return protoreflect.Value{}, out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
-			v, n := wire.ConsumeFixed32(b)
+			v, n := protowire.ConsumeFixed32(b)
 			if n < 0 {
-				return protoreflect.Value{}, out, wire.ParseError(n)
+				return protoreflect.Value{}, out, protowire.ParseError(n)
 			}
 			list.Append(protoreflect.ValueOfInt32(int32(v)))
 			b = b[n:]
@@ -3282,12 +3282,12 @@
 		out.n = n
 		return listv, out, nil
 	}
-	if wtyp != wire.Fixed32Type {
+	if wtyp != protowire.Fixed32Type {
 		return protoreflect.Value{}, out, errUnknown
 	}
-	v, n := wire.ConsumeFixed32(b)
+	v, n := protowire.ConsumeFixed32(b)
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	list.Append(protoreflect.ValueOfInt32(int32(v)))
 	out.n = n
@@ -3308,8 +3308,8 @@
 	if llen == 0 {
 		return 0
 	}
-	n := llen * wire.SizeFixed32()
-	return tagsize + wire.SizeBytes(n)
+	n := llen * protowire.SizeFixed32()
+	return tagsize + protowire.SizeBytes(n)
 }
 
 // appendSfixed32PackedSliceValue encodes a []int32 value as a packed repeated Sfixed32.
@@ -3319,12 +3319,12 @@
 	if llen == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, wiretag)
-	n := llen * wire.SizeFixed32()
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, wiretag)
+	n := llen * protowire.SizeFixed32()
+	b = protowire.AppendVarint(b, uint64(n))
 	for i := 0; i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendFixed32(b, uint32(v.Int()))
+		b = protowire.AppendFixed32(b, uint32(v.Int()))
 	}
 	return b, nil
 }
@@ -3339,25 +3339,25 @@
 // sizeFixed32 returns the size of wire encoding a uint32 pointer as a Fixed32.
 func sizeFixed32(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 
-	return f.tagsize + wire.SizeFixed32()
+	return f.tagsize + protowire.SizeFixed32()
 }
 
 // appendFixed32 wire encodes a uint32 pointer as a Fixed32.
 func appendFixed32(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := *p.Uint32()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendFixed32(b, v)
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendFixed32(b, v)
 	return b, nil
 }
 
 // consumeFixed32 wire decodes a uint32 pointer as a Fixed32.
-func consumeFixed32(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.Fixed32Type {
+func consumeFixed32(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.Fixed32Type {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeFixed32(b)
+	v, n := protowire.ConsumeFixed32(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	*p.Uint32() = v
 	out.n = n
@@ -3378,7 +3378,7 @@
 	if v == 0 {
 		return 0
 	}
-	return f.tagsize + wire.SizeFixed32()
+	return f.tagsize + protowire.SizeFixed32()
 }
 
 // appendFixed32NoZero wire encodes a uint32 pointer as a Fixed32.
@@ -3388,8 +3388,8 @@
 	if v == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendFixed32(b, v)
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendFixed32(b, v)
 	return b, nil
 }
 
@@ -3403,26 +3403,26 @@
 // sizeFixed32Ptr returns the size of wire encoding a *uint32 pointer as a Fixed32.
 // It panics if the pointer is nil.
 func sizeFixed32Ptr(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
-	return f.tagsize + wire.SizeFixed32()
+	return f.tagsize + protowire.SizeFixed32()
 }
 
 // appendFixed32Ptr wire encodes a *uint32 pointer as a Fixed32.
 // It panics if the pointer is nil.
 func appendFixed32Ptr(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := **p.Uint32Ptr()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendFixed32(b, v)
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendFixed32(b, v)
 	return b, nil
 }
 
 // consumeFixed32Ptr wire decodes a *uint32 pointer as a Fixed32.
-func consumeFixed32Ptr(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.Fixed32Type {
+func consumeFixed32Ptr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.Fixed32Type {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeFixed32(b)
+	v, n := protowire.ConsumeFixed32(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	vp := p.Uint32Ptr()
 	if *vp == nil {
@@ -3443,7 +3443,7 @@
 // sizeFixed32Slice returns the size of wire encoding a []uint32 pointer as a repeated Fixed32.
 func sizeFixed32Slice(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	s := *p.Uint32Slice()
-	size = len(s) * (f.tagsize + wire.SizeFixed32())
+	size = len(s) * (f.tagsize + protowire.SizeFixed32())
 	return size
 }
 
@@ -3451,25 +3451,25 @@
 func appendFixed32Slice(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	s := *p.Uint32Slice()
 	for _, v := range s {
-		b = wire.AppendVarint(b, f.wiretag)
-		b = wire.AppendFixed32(b, v)
+		b = protowire.AppendVarint(b, f.wiretag)
+		b = protowire.AppendFixed32(b, v)
 	}
 	return b, nil
 }
 
 // consumeFixed32Slice wire decodes a []uint32 pointer as a repeated Fixed32.
-func consumeFixed32Slice(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+func consumeFixed32Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
 	sp := p.Uint32Slice()
-	if wtyp == wire.BytesType {
+	if wtyp == protowire.BytesType {
 		s := *sp
-		b, n := wire.ConsumeBytes(b)
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return out, wire.ParseError(n)
+			return out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
-			v, n := wire.ConsumeFixed32(b)
+			v, n := protowire.ConsumeFixed32(b)
 			if n < 0 {
-				return out, wire.ParseError(n)
+				return out, protowire.ParseError(n)
 			}
 			s = append(s, v)
 			b = b[n:]
@@ -3478,12 +3478,12 @@
 		out.n = n
 		return out, nil
 	}
-	if wtyp != wire.Fixed32Type {
+	if wtyp != protowire.Fixed32Type {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeFixed32(b)
+	v, n := protowire.ConsumeFixed32(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	*sp = append(*sp, v)
 	out.n = n
@@ -3503,8 +3503,8 @@
 	if len(s) == 0 {
 		return 0
 	}
-	n := len(s) * wire.SizeFixed32()
-	return f.tagsize + wire.SizeBytes(n)
+	n := len(s) * protowire.SizeFixed32()
+	return f.tagsize + protowire.SizeBytes(n)
 }
 
 // appendFixed32PackedSlice encodes a []uint32 pointer as a packed repeated Fixed32.
@@ -3513,11 +3513,11 @@
 	if len(s) == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
-	n := len(s) * wire.SizeFixed32()
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, f.wiretag)
+	n := len(s) * protowire.SizeFixed32()
+	b = protowire.AppendVarint(b, uint64(n))
 	for _, v := range s {
-		b = wire.AppendFixed32(b, v)
+		b = protowire.AppendFixed32(b, v)
 	}
 	return b, nil
 }
@@ -3531,24 +3531,24 @@
 
 // sizeFixed32Value returns the size of wire encoding a uint32 value as a Fixed32.
 func sizeFixed32Value(v protoreflect.Value, tagsize int, _ marshalOptions) int {
-	return tagsize + wire.SizeFixed32()
+	return tagsize + protowire.SizeFixed32()
 }
 
 // appendFixed32Value encodes a uint32 value as a Fixed32.
 func appendFixed32Value(b []byte, v protoreflect.Value, wiretag uint64, _ marshalOptions) ([]byte, error) {
-	b = wire.AppendVarint(b, wiretag)
-	b = wire.AppendFixed32(b, uint32(v.Uint()))
+	b = protowire.AppendVarint(b, wiretag)
+	b = protowire.AppendFixed32(b, uint32(v.Uint()))
 	return b, nil
 }
 
 // consumeFixed32Value decodes a uint32 value as a Fixed32.
-func consumeFixed32Value(b []byte, _ protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
-	if wtyp != wire.Fixed32Type {
+func consumeFixed32Value(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+	if wtyp != protowire.Fixed32Type {
 		return protoreflect.Value{}, out, errUnknown
 	}
-	v, n := wire.ConsumeFixed32(b)
+	v, n := protowire.ConsumeFixed32(b)
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	out.n = n
 	return protoreflect.ValueOfUint32(uint32(v)), out, nil
@@ -3564,7 +3564,7 @@
 // sizeFixed32SliceValue returns the size of wire encoding a []uint32 value as a repeated Fixed32.
 func sizeFixed32SliceValue(listv protoreflect.Value, tagsize int, _ marshalOptions) (size int) {
 	list := listv.List()
-	size = list.Len() * (tagsize + wire.SizeFixed32())
+	size = list.Len() * (tagsize + protowire.SizeFixed32())
 	return size
 }
 
@@ -3573,24 +3573,24 @@
 	list := listv.List()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendVarint(b, wiretag)
-		b = wire.AppendFixed32(b, uint32(v.Uint()))
+		b = protowire.AppendVarint(b, wiretag)
+		b = protowire.AppendFixed32(b, uint32(v.Uint()))
 	}
 	return b, nil
 }
 
 // consumeFixed32SliceValue wire decodes a []uint32 value as a repeated Fixed32.
-func consumeFixed32SliceValue(b []byte, listv protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+func consumeFixed32SliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
 	list := listv.List()
-	if wtyp == wire.BytesType {
-		b, n := wire.ConsumeBytes(b)
+	if wtyp == protowire.BytesType {
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return protoreflect.Value{}, out, wire.ParseError(n)
+			return protoreflect.Value{}, out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
-			v, n := wire.ConsumeFixed32(b)
+			v, n := protowire.ConsumeFixed32(b)
 			if n < 0 {
-				return protoreflect.Value{}, out, wire.ParseError(n)
+				return protoreflect.Value{}, out, protowire.ParseError(n)
 			}
 			list.Append(protoreflect.ValueOfUint32(uint32(v)))
 			b = b[n:]
@@ -3598,12 +3598,12 @@
 		out.n = n
 		return listv, out, nil
 	}
-	if wtyp != wire.Fixed32Type {
+	if wtyp != protowire.Fixed32Type {
 		return protoreflect.Value{}, out, errUnknown
 	}
-	v, n := wire.ConsumeFixed32(b)
+	v, n := protowire.ConsumeFixed32(b)
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	list.Append(protoreflect.ValueOfUint32(uint32(v)))
 	out.n = n
@@ -3624,8 +3624,8 @@
 	if llen == 0 {
 		return 0
 	}
-	n := llen * wire.SizeFixed32()
-	return tagsize + wire.SizeBytes(n)
+	n := llen * protowire.SizeFixed32()
+	return tagsize + protowire.SizeBytes(n)
 }
 
 // appendFixed32PackedSliceValue encodes a []uint32 value as a packed repeated Fixed32.
@@ -3635,12 +3635,12 @@
 	if llen == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, wiretag)
-	n := llen * wire.SizeFixed32()
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, wiretag)
+	n := llen * protowire.SizeFixed32()
+	b = protowire.AppendVarint(b, uint64(n))
 	for i := 0; i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendFixed32(b, uint32(v.Uint()))
+		b = protowire.AppendFixed32(b, uint32(v.Uint()))
 	}
 	return b, nil
 }
@@ -3655,25 +3655,25 @@
 // sizeFloat returns the size of wire encoding a float32 pointer as a Float.
 func sizeFloat(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 
-	return f.tagsize + wire.SizeFixed32()
+	return f.tagsize + protowire.SizeFixed32()
 }
 
 // appendFloat wire encodes a float32 pointer as a Float.
 func appendFloat(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := *p.Float32()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendFixed32(b, math.Float32bits(v))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendFixed32(b, math.Float32bits(v))
 	return b, nil
 }
 
 // consumeFloat wire decodes a float32 pointer as a Float.
-func consumeFloat(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.Fixed32Type {
+func consumeFloat(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.Fixed32Type {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeFixed32(b)
+	v, n := protowire.ConsumeFixed32(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	*p.Float32() = math.Float32frombits(v)
 	out.n = n
@@ -3694,7 +3694,7 @@
 	if v == 0 && !math.Signbit(float64(v)) {
 		return 0
 	}
-	return f.tagsize + wire.SizeFixed32()
+	return f.tagsize + protowire.SizeFixed32()
 }
 
 // appendFloatNoZero wire encodes a float32 pointer as a Float.
@@ -3704,8 +3704,8 @@
 	if v == 0 && !math.Signbit(float64(v)) {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendFixed32(b, math.Float32bits(v))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendFixed32(b, math.Float32bits(v))
 	return b, nil
 }
 
@@ -3719,26 +3719,26 @@
 // sizeFloatPtr returns the size of wire encoding a *float32 pointer as a Float.
 // It panics if the pointer is nil.
 func sizeFloatPtr(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
-	return f.tagsize + wire.SizeFixed32()
+	return f.tagsize + protowire.SizeFixed32()
 }
 
 // appendFloatPtr wire encodes a *float32 pointer as a Float.
 // It panics if the pointer is nil.
 func appendFloatPtr(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := **p.Float32Ptr()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendFixed32(b, math.Float32bits(v))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendFixed32(b, math.Float32bits(v))
 	return b, nil
 }
 
 // consumeFloatPtr wire decodes a *float32 pointer as a Float.
-func consumeFloatPtr(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.Fixed32Type {
+func consumeFloatPtr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.Fixed32Type {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeFixed32(b)
+	v, n := protowire.ConsumeFixed32(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	vp := p.Float32Ptr()
 	if *vp == nil {
@@ -3759,7 +3759,7 @@
 // sizeFloatSlice returns the size of wire encoding a []float32 pointer as a repeated Float.
 func sizeFloatSlice(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	s := *p.Float32Slice()
-	size = len(s) * (f.tagsize + wire.SizeFixed32())
+	size = len(s) * (f.tagsize + protowire.SizeFixed32())
 	return size
 }
 
@@ -3767,25 +3767,25 @@
 func appendFloatSlice(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	s := *p.Float32Slice()
 	for _, v := range s {
-		b = wire.AppendVarint(b, f.wiretag)
-		b = wire.AppendFixed32(b, math.Float32bits(v))
+		b = protowire.AppendVarint(b, f.wiretag)
+		b = protowire.AppendFixed32(b, math.Float32bits(v))
 	}
 	return b, nil
 }
 
 // consumeFloatSlice wire decodes a []float32 pointer as a repeated Float.
-func consumeFloatSlice(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+func consumeFloatSlice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
 	sp := p.Float32Slice()
-	if wtyp == wire.BytesType {
+	if wtyp == protowire.BytesType {
 		s := *sp
-		b, n := wire.ConsumeBytes(b)
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return out, wire.ParseError(n)
+			return out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
-			v, n := wire.ConsumeFixed32(b)
+			v, n := protowire.ConsumeFixed32(b)
 			if n < 0 {
-				return out, wire.ParseError(n)
+				return out, protowire.ParseError(n)
 			}
 			s = append(s, math.Float32frombits(v))
 			b = b[n:]
@@ -3794,12 +3794,12 @@
 		out.n = n
 		return out, nil
 	}
-	if wtyp != wire.Fixed32Type {
+	if wtyp != protowire.Fixed32Type {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeFixed32(b)
+	v, n := protowire.ConsumeFixed32(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	*sp = append(*sp, math.Float32frombits(v))
 	out.n = n
@@ -3819,8 +3819,8 @@
 	if len(s) == 0 {
 		return 0
 	}
-	n := len(s) * wire.SizeFixed32()
-	return f.tagsize + wire.SizeBytes(n)
+	n := len(s) * protowire.SizeFixed32()
+	return f.tagsize + protowire.SizeBytes(n)
 }
 
 // appendFloatPackedSlice encodes a []float32 pointer as a packed repeated Float.
@@ -3829,11 +3829,11 @@
 	if len(s) == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
-	n := len(s) * wire.SizeFixed32()
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, f.wiretag)
+	n := len(s) * protowire.SizeFixed32()
+	b = protowire.AppendVarint(b, uint64(n))
 	for _, v := range s {
-		b = wire.AppendFixed32(b, math.Float32bits(v))
+		b = protowire.AppendFixed32(b, math.Float32bits(v))
 	}
 	return b, nil
 }
@@ -3847,24 +3847,24 @@
 
 // sizeFloatValue returns the size of wire encoding a float32 value as a Float.
 func sizeFloatValue(v protoreflect.Value, tagsize int, _ marshalOptions) int {
-	return tagsize + wire.SizeFixed32()
+	return tagsize + protowire.SizeFixed32()
 }
 
 // appendFloatValue encodes a float32 value as a Float.
 func appendFloatValue(b []byte, v protoreflect.Value, wiretag uint64, _ marshalOptions) ([]byte, error) {
-	b = wire.AppendVarint(b, wiretag)
-	b = wire.AppendFixed32(b, math.Float32bits(float32(v.Float())))
+	b = protowire.AppendVarint(b, wiretag)
+	b = protowire.AppendFixed32(b, math.Float32bits(float32(v.Float())))
 	return b, nil
 }
 
 // consumeFloatValue decodes a float32 value as a Float.
-func consumeFloatValue(b []byte, _ protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
-	if wtyp != wire.Fixed32Type {
+func consumeFloatValue(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+	if wtyp != protowire.Fixed32Type {
 		return protoreflect.Value{}, out, errUnknown
 	}
-	v, n := wire.ConsumeFixed32(b)
+	v, n := protowire.ConsumeFixed32(b)
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	out.n = n
 	return protoreflect.ValueOfFloat32(math.Float32frombits(uint32(v))), out, nil
@@ -3880,7 +3880,7 @@
 // sizeFloatSliceValue returns the size of wire encoding a []float32 value as a repeated Float.
 func sizeFloatSliceValue(listv protoreflect.Value, tagsize int, _ marshalOptions) (size int) {
 	list := listv.List()
-	size = list.Len() * (tagsize + wire.SizeFixed32())
+	size = list.Len() * (tagsize + protowire.SizeFixed32())
 	return size
 }
 
@@ -3889,24 +3889,24 @@
 	list := listv.List()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendVarint(b, wiretag)
-		b = wire.AppendFixed32(b, math.Float32bits(float32(v.Float())))
+		b = protowire.AppendVarint(b, wiretag)
+		b = protowire.AppendFixed32(b, math.Float32bits(float32(v.Float())))
 	}
 	return b, nil
 }
 
 // consumeFloatSliceValue wire decodes a []float32 value as a repeated Float.
-func consumeFloatSliceValue(b []byte, listv protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+func consumeFloatSliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
 	list := listv.List()
-	if wtyp == wire.BytesType {
-		b, n := wire.ConsumeBytes(b)
+	if wtyp == protowire.BytesType {
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return protoreflect.Value{}, out, wire.ParseError(n)
+			return protoreflect.Value{}, out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
-			v, n := wire.ConsumeFixed32(b)
+			v, n := protowire.ConsumeFixed32(b)
 			if n < 0 {
-				return protoreflect.Value{}, out, wire.ParseError(n)
+				return protoreflect.Value{}, out, protowire.ParseError(n)
 			}
 			list.Append(protoreflect.ValueOfFloat32(math.Float32frombits(uint32(v))))
 			b = b[n:]
@@ -3914,12 +3914,12 @@
 		out.n = n
 		return listv, out, nil
 	}
-	if wtyp != wire.Fixed32Type {
+	if wtyp != protowire.Fixed32Type {
 		return protoreflect.Value{}, out, errUnknown
 	}
-	v, n := wire.ConsumeFixed32(b)
+	v, n := protowire.ConsumeFixed32(b)
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	list.Append(protoreflect.ValueOfFloat32(math.Float32frombits(uint32(v))))
 	out.n = n
@@ -3940,8 +3940,8 @@
 	if llen == 0 {
 		return 0
 	}
-	n := llen * wire.SizeFixed32()
-	return tagsize + wire.SizeBytes(n)
+	n := llen * protowire.SizeFixed32()
+	return tagsize + protowire.SizeBytes(n)
 }
 
 // appendFloatPackedSliceValue encodes a []float32 value as a packed repeated Float.
@@ -3951,12 +3951,12 @@
 	if llen == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, wiretag)
-	n := llen * wire.SizeFixed32()
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, wiretag)
+	n := llen * protowire.SizeFixed32()
+	b = protowire.AppendVarint(b, uint64(n))
 	for i := 0; i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendFixed32(b, math.Float32bits(float32(v.Float())))
+		b = protowire.AppendFixed32(b, math.Float32bits(float32(v.Float())))
 	}
 	return b, nil
 }
@@ -3971,25 +3971,25 @@
 // sizeSfixed64 returns the size of wire encoding a int64 pointer as a Sfixed64.
 func sizeSfixed64(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 
-	return f.tagsize + wire.SizeFixed64()
+	return f.tagsize + protowire.SizeFixed64()
 }
 
 // appendSfixed64 wire encodes a int64 pointer as a Sfixed64.
 func appendSfixed64(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := *p.Int64()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendFixed64(b, uint64(v))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendFixed64(b, uint64(v))
 	return b, nil
 }
 
 // consumeSfixed64 wire decodes a int64 pointer as a Sfixed64.
-func consumeSfixed64(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.Fixed64Type {
+func consumeSfixed64(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.Fixed64Type {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeFixed64(b)
+	v, n := protowire.ConsumeFixed64(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	*p.Int64() = int64(v)
 	out.n = n
@@ -4010,7 +4010,7 @@
 	if v == 0 {
 		return 0
 	}
-	return f.tagsize + wire.SizeFixed64()
+	return f.tagsize + protowire.SizeFixed64()
 }
 
 // appendSfixed64NoZero wire encodes a int64 pointer as a Sfixed64.
@@ -4020,8 +4020,8 @@
 	if v == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendFixed64(b, uint64(v))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendFixed64(b, uint64(v))
 	return b, nil
 }
 
@@ -4035,26 +4035,26 @@
 // sizeSfixed64Ptr returns the size of wire encoding a *int64 pointer as a Sfixed64.
 // It panics if the pointer is nil.
 func sizeSfixed64Ptr(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
-	return f.tagsize + wire.SizeFixed64()
+	return f.tagsize + protowire.SizeFixed64()
 }
 
 // appendSfixed64Ptr wire encodes a *int64 pointer as a Sfixed64.
 // It panics if the pointer is nil.
 func appendSfixed64Ptr(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := **p.Int64Ptr()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendFixed64(b, uint64(v))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendFixed64(b, uint64(v))
 	return b, nil
 }
 
 // consumeSfixed64Ptr wire decodes a *int64 pointer as a Sfixed64.
-func consumeSfixed64Ptr(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.Fixed64Type {
+func consumeSfixed64Ptr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.Fixed64Type {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeFixed64(b)
+	v, n := protowire.ConsumeFixed64(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	vp := p.Int64Ptr()
 	if *vp == nil {
@@ -4075,7 +4075,7 @@
 // sizeSfixed64Slice returns the size of wire encoding a []int64 pointer as a repeated Sfixed64.
 func sizeSfixed64Slice(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	s := *p.Int64Slice()
-	size = len(s) * (f.tagsize + wire.SizeFixed64())
+	size = len(s) * (f.tagsize + protowire.SizeFixed64())
 	return size
 }
 
@@ -4083,25 +4083,25 @@
 func appendSfixed64Slice(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	s := *p.Int64Slice()
 	for _, v := range s {
-		b = wire.AppendVarint(b, f.wiretag)
-		b = wire.AppendFixed64(b, uint64(v))
+		b = protowire.AppendVarint(b, f.wiretag)
+		b = protowire.AppendFixed64(b, uint64(v))
 	}
 	return b, nil
 }
 
 // consumeSfixed64Slice wire decodes a []int64 pointer as a repeated Sfixed64.
-func consumeSfixed64Slice(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+func consumeSfixed64Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
 	sp := p.Int64Slice()
-	if wtyp == wire.BytesType {
+	if wtyp == protowire.BytesType {
 		s := *sp
-		b, n := wire.ConsumeBytes(b)
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return out, wire.ParseError(n)
+			return out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
-			v, n := wire.ConsumeFixed64(b)
+			v, n := protowire.ConsumeFixed64(b)
 			if n < 0 {
-				return out, wire.ParseError(n)
+				return out, protowire.ParseError(n)
 			}
 			s = append(s, int64(v))
 			b = b[n:]
@@ -4110,12 +4110,12 @@
 		out.n = n
 		return out, nil
 	}
-	if wtyp != wire.Fixed64Type {
+	if wtyp != protowire.Fixed64Type {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeFixed64(b)
+	v, n := protowire.ConsumeFixed64(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	*sp = append(*sp, int64(v))
 	out.n = n
@@ -4135,8 +4135,8 @@
 	if len(s) == 0 {
 		return 0
 	}
-	n := len(s) * wire.SizeFixed64()
-	return f.tagsize + wire.SizeBytes(n)
+	n := len(s) * protowire.SizeFixed64()
+	return f.tagsize + protowire.SizeBytes(n)
 }
 
 // appendSfixed64PackedSlice encodes a []int64 pointer as a packed repeated Sfixed64.
@@ -4145,11 +4145,11 @@
 	if len(s) == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
-	n := len(s) * wire.SizeFixed64()
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, f.wiretag)
+	n := len(s) * protowire.SizeFixed64()
+	b = protowire.AppendVarint(b, uint64(n))
 	for _, v := range s {
-		b = wire.AppendFixed64(b, uint64(v))
+		b = protowire.AppendFixed64(b, uint64(v))
 	}
 	return b, nil
 }
@@ -4163,24 +4163,24 @@
 
 // sizeSfixed64Value returns the size of wire encoding a int64 value as a Sfixed64.
 func sizeSfixed64Value(v protoreflect.Value, tagsize int, _ marshalOptions) int {
-	return tagsize + wire.SizeFixed64()
+	return tagsize + protowire.SizeFixed64()
 }
 
 // appendSfixed64Value encodes a int64 value as a Sfixed64.
 func appendSfixed64Value(b []byte, v protoreflect.Value, wiretag uint64, _ marshalOptions) ([]byte, error) {
-	b = wire.AppendVarint(b, wiretag)
-	b = wire.AppendFixed64(b, uint64(v.Int()))
+	b = protowire.AppendVarint(b, wiretag)
+	b = protowire.AppendFixed64(b, uint64(v.Int()))
 	return b, nil
 }
 
 // consumeSfixed64Value decodes a int64 value as a Sfixed64.
-func consumeSfixed64Value(b []byte, _ protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
-	if wtyp != wire.Fixed64Type {
+func consumeSfixed64Value(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+	if wtyp != protowire.Fixed64Type {
 		return protoreflect.Value{}, out, errUnknown
 	}
-	v, n := wire.ConsumeFixed64(b)
+	v, n := protowire.ConsumeFixed64(b)
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	out.n = n
 	return protoreflect.ValueOfInt64(int64(v)), out, nil
@@ -4196,7 +4196,7 @@
 // sizeSfixed64SliceValue returns the size of wire encoding a []int64 value as a repeated Sfixed64.
 func sizeSfixed64SliceValue(listv protoreflect.Value, tagsize int, _ marshalOptions) (size int) {
 	list := listv.List()
-	size = list.Len() * (tagsize + wire.SizeFixed64())
+	size = list.Len() * (tagsize + protowire.SizeFixed64())
 	return size
 }
 
@@ -4205,24 +4205,24 @@
 	list := listv.List()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendVarint(b, wiretag)
-		b = wire.AppendFixed64(b, uint64(v.Int()))
+		b = protowire.AppendVarint(b, wiretag)
+		b = protowire.AppendFixed64(b, uint64(v.Int()))
 	}
 	return b, nil
 }
 
 // consumeSfixed64SliceValue wire decodes a []int64 value as a repeated Sfixed64.
-func consumeSfixed64SliceValue(b []byte, listv protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+func consumeSfixed64SliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
 	list := listv.List()
-	if wtyp == wire.BytesType {
-		b, n := wire.ConsumeBytes(b)
+	if wtyp == protowire.BytesType {
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return protoreflect.Value{}, out, wire.ParseError(n)
+			return protoreflect.Value{}, out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
-			v, n := wire.ConsumeFixed64(b)
+			v, n := protowire.ConsumeFixed64(b)
 			if n < 0 {
-				return protoreflect.Value{}, out, wire.ParseError(n)
+				return protoreflect.Value{}, out, protowire.ParseError(n)
 			}
 			list.Append(protoreflect.ValueOfInt64(int64(v)))
 			b = b[n:]
@@ -4230,12 +4230,12 @@
 		out.n = n
 		return listv, out, nil
 	}
-	if wtyp != wire.Fixed64Type {
+	if wtyp != protowire.Fixed64Type {
 		return protoreflect.Value{}, out, errUnknown
 	}
-	v, n := wire.ConsumeFixed64(b)
+	v, n := protowire.ConsumeFixed64(b)
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	list.Append(protoreflect.ValueOfInt64(int64(v)))
 	out.n = n
@@ -4256,8 +4256,8 @@
 	if llen == 0 {
 		return 0
 	}
-	n := llen * wire.SizeFixed64()
-	return tagsize + wire.SizeBytes(n)
+	n := llen * protowire.SizeFixed64()
+	return tagsize + protowire.SizeBytes(n)
 }
 
 // appendSfixed64PackedSliceValue encodes a []int64 value as a packed repeated Sfixed64.
@@ -4267,12 +4267,12 @@
 	if llen == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, wiretag)
-	n := llen * wire.SizeFixed64()
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, wiretag)
+	n := llen * protowire.SizeFixed64()
+	b = protowire.AppendVarint(b, uint64(n))
 	for i := 0; i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendFixed64(b, uint64(v.Int()))
+		b = protowire.AppendFixed64(b, uint64(v.Int()))
 	}
 	return b, nil
 }
@@ -4287,25 +4287,25 @@
 // sizeFixed64 returns the size of wire encoding a uint64 pointer as a Fixed64.
 func sizeFixed64(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 
-	return f.tagsize + wire.SizeFixed64()
+	return f.tagsize + protowire.SizeFixed64()
 }
 
 // appendFixed64 wire encodes a uint64 pointer as a Fixed64.
 func appendFixed64(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := *p.Uint64()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendFixed64(b, v)
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendFixed64(b, v)
 	return b, nil
 }
 
 // consumeFixed64 wire decodes a uint64 pointer as a Fixed64.
-func consumeFixed64(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.Fixed64Type {
+func consumeFixed64(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.Fixed64Type {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeFixed64(b)
+	v, n := protowire.ConsumeFixed64(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	*p.Uint64() = v
 	out.n = n
@@ -4326,7 +4326,7 @@
 	if v == 0 {
 		return 0
 	}
-	return f.tagsize + wire.SizeFixed64()
+	return f.tagsize + protowire.SizeFixed64()
 }
 
 // appendFixed64NoZero wire encodes a uint64 pointer as a Fixed64.
@@ -4336,8 +4336,8 @@
 	if v == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendFixed64(b, v)
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendFixed64(b, v)
 	return b, nil
 }
 
@@ -4351,26 +4351,26 @@
 // sizeFixed64Ptr returns the size of wire encoding a *uint64 pointer as a Fixed64.
 // It panics if the pointer is nil.
 func sizeFixed64Ptr(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
-	return f.tagsize + wire.SizeFixed64()
+	return f.tagsize + protowire.SizeFixed64()
 }
 
 // appendFixed64Ptr wire encodes a *uint64 pointer as a Fixed64.
 // It panics if the pointer is nil.
 func appendFixed64Ptr(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := **p.Uint64Ptr()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendFixed64(b, v)
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendFixed64(b, v)
 	return b, nil
 }
 
 // consumeFixed64Ptr wire decodes a *uint64 pointer as a Fixed64.
-func consumeFixed64Ptr(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.Fixed64Type {
+func consumeFixed64Ptr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.Fixed64Type {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeFixed64(b)
+	v, n := protowire.ConsumeFixed64(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	vp := p.Uint64Ptr()
 	if *vp == nil {
@@ -4391,7 +4391,7 @@
 // sizeFixed64Slice returns the size of wire encoding a []uint64 pointer as a repeated Fixed64.
 func sizeFixed64Slice(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	s := *p.Uint64Slice()
-	size = len(s) * (f.tagsize + wire.SizeFixed64())
+	size = len(s) * (f.tagsize + protowire.SizeFixed64())
 	return size
 }
 
@@ -4399,25 +4399,25 @@
 func appendFixed64Slice(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	s := *p.Uint64Slice()
 	for _, v := range s {
-		b = wire.AppendVarint(b, f.wiretag)
-		b = wire.AppendFixed64(b, v)
+		b = protowire.AppendVarint(b, f.wiretag)
+		b = protowire.AppendFixed64(b, v)
 	}
 	return b, nil
 }
 
 // consumeFixed64Slice wire decodes a []uint64 pointer as a repeated Fixed64.
-func consumeFixed64Slice(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+func consumeFixed64Slice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
 	sp := p.Uint64Slice()
-	if wtyp == wire.BytesType {
+	if wtyp == protowire.BytesType {
 		s := *sp
-		b, n := wire.ConsumeBytes(b)
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return out, wire.ParseError(n)
+			return out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
-			v, n := wire.ConsumeFixed64(b)
+			v, n := protowire.ConsumeFixed64(b)
 			if n < 0 {
-				return out, wire.ParseError(n)
+				return out, protowire.ParseError(n)
 			}
 			s = append(s, v)
 			b = b[n:]
@@ -4426,12 +4426,12 @@
 		out.n = n
 		return out, nil
 	}
-	if wtyp != wire.Fixed64Type {
+	if wtyp != protowire.Fixed64Type {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeFixed64(b)
+	v, n := protowire.ConsumeFixed64(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	*sp = append(*sp, v)
 	out.n = n
@@ -4451,8 +4451,8 @@
 	if len(s) == 0 {
 		return 0
 	}
-	n := len(s) * wire.SizeFixed64()
-	return f.tagsize + wire.SizeBytes(n)
+	n := len(s) * protowire.SizeFixed64()
+	return f.tagsize + protowire.SizeBytes(n)
 }
 
 // appendFixed64PackedSlice encodes a []uint64 pointer as a packed repeated Fixed64.
@@ -4461,11 +4461,11 @@
 	if len(s) == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
-	n := len(s) * wire.SizeFixed64()
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, f.wiretag)
+	n := len(s) * protowire.SizeFixed64()
+	b = protowire.AppendVarint(b, uint64(n))
 	for _, v := range s {
-		b = wire.AppendFixed64(b, v)
+		b = protowire.AppendFixed64(b, v)
 	}
 	return b, nil
 }
@@ -4479,24 +4479,24 @@
 
 // sizeFixed64Value returns the size of wire encoding a uint64 value as a Fixed64.
 func sizeFixed64Value(v protoreflect.Value, tagsize int, _ marshalOptions) int {
-	return tagsize + wire.SizeFixed64()
+	return tagsize + protowire.SizeFixed64()
 }
 
 // appendFixed64Value encodes a uint64 value as a Fixed64.
 func appendFixed64Value(b []byte, v protoreflect.Value, wiretag uint64, _ marshalOptions) ([]byte, error) {
-	b = wire.AppendVarint(b, wiretag)
-	b = wire.AppendFixed64(b, v.Uint())
+	b = protowire.AppendVarint(b, wiretag)
+	b = protowire.AppendFixed64(b, v.Uint())
 	return b, nil
 }
 
 // consumeFixed64Value decodes a uint64 value as a Fixed64.
-func consumeFixed64Value(b []byte, _ protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
-	if wtyp != wire.Fixed64Type {
+func consumeFixed64Value(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+	if wtyp != protowire.Fixed64Type {
 		return protoreflect.Value{}, out, errUnknown
 	}
-	v, n := wire.ConsumeFixed64(b)
+	v, n := protowire.ConsumeFixed64(b)
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	out.n = n
 	return protoreflect.ValueOfUint64(v), out, nil
@@ -4512,7 +4512,7 @@
 // sizeFixed64SliceValue returns the size of wire encoding a []uint64 value as a repeated Fixed64.
 func sizeFixed64SliceValue(listv protoreflect.Value, tagsize int, _ marshalOptions) (size int) {
 	list := listv.List()
-	size = list.Len() * (tagsize + wire.SizeFixed64())
+	size = list.Len() * (tagsize + protowire.SizeFixed64())
 	return size
 }
 
@@ -4521,24 +4521,24 @@
 	list := listv.List()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendVarint(b, wiretag)
-		b = wire.AppendFixed64(b, v.Uint())
+		b = protowire.AppendVarint(b, wiretag)
+		b = protowire.AppendFixed64(b, v.Uint())
 	}
 	return b, nil
 }
 
 // consumeFixed64SliceValue wire decodes a []uint64 value as a repeated Fixed64.
-func consumeFixed64SliceValue(b []byte, listv protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+func consumeFixed64SliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
 	list := listv.List()
-	if wtyp == wire.BytesType {
-		b, n := wire.ConsumeBytes(b)
+	if wtyp == protowire.BytesType {
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return protoreflect.Value{}, out, wire.ParseError(n)
+			return protoreflect.Value{}, out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
-			v, n := wire.ConsumeFixed64(b)
+			v, n := protowire.ConsumeFixed64(b)
 			if n < 0 {
-				return protoreflect.Value{}, out, wire.ParseError(n)
+				return protoreflect.Value{}, out, protowire.ParseError(n)
 			}
 			list.Append(protoreflect.ValueOfUint64(v))
 			b = b[n:]
@@ -4546,12 +4546,12 @@
 		out.n = n
 		return listv, out, nil
 	}
-	if wtyp != wire.Fixed64Type {
+	if wtyp != protowire.Fixed64Type {
 		return protoreflect.Value{}, out, errUnknown
 	}
-	v, n := wire.ConsumeFixed64(b)
+	v, n := protowire.ConsumeFixed64(b)
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	list.Append(protoreflect.ValueOfUint64(v))
 	out.n = n
@@ -4572,8 +4572,8 @@
 	if llen == 0 {
 		return 0
 	}
-	n := llen * wire.SizeFixed64()
-	return tagsize + wire.SizeBytes(n)
+	n := llen * protowire.SizeFixed64()
+	return tagsize + protowire.SizeBytes(n)
 }
 
 // appendFixed64PackedSliceValue encodes a []uint64 value as a packed repeated Fixed64.
@@ -4583,12 +4583,12 @@
 	if llen == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, wiretag)
-	n := llen * wire.SizeFixed64()
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, wiretag)
+	n := llen * protowire.SizeFixed64()
+	b = protowire.AppendVarint(b, uint64(n))
 	for i := 0; i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendFixed64(b, v.Uint())
+		b = protowire.AppendFixed64(b, v.Uint())
 	}
 	return b, nil
 }
@@ -4603,25 +4603,25 @@
 // sizeDouble returns the size of wire encoding a float64 pointer as a Double.
 func sizeDouble(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 
-	return f.tagsize + wire.SizeFixed64()
+	return f.tagsize + protowire.SizeFixed64()
 }
 
 // appendDouble wire encodes a float64 pointer as a Double.
 func appendDouble(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := *p.Float64()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendFixed64(b, math.Float64bits(v))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendFixed64(b, math.Float64bits(v))
 	return b, nil
 }
 
 // consumeDouble wire decodes a float64 pointer as a Double.
-func consumeDouble(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.Fixed64Type {
+func consumeDouble(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.Fixed64Type {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeFixed64(b)
+	v, n := protowire.ConsumeFixed64(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	*p.Float64() = math.Float64frombits(v)
 	out.n = n
@@ -4642,7 +4642,7 @@
 	if v == 0 && !math.Signbit(float64(v)) {
 		return 0
 	}
-	return f.tagsize + wire.SizeFixed64()
+	return f.tagsize + protowire.SizeFixed64()
 }
 
 // appendDoubleNoZero wire encodes a float64 pointer as a Double.
@@ -4652,8 +4652,8 @@
 	if v == 0 && !math.Signbit(float64(v)) {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendFixed64(b, math.Float64bits(v))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendFixed64(b, math.Float64bits(v))
 	return b, nil
 }
 
@@ -4667,26 +4667,26 @@
 // sizeDoublePtr returns the size of wire encoding a *float64 pointer as a Double.
 // It panics if the pointer is nil.
 func sizeDoublePtr(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
-	return f.tagsize + wire.SizeFixed64()
+	return f.tagsize + protowire.SizeFixed64()
 }
 
 // appendDoublePtr wire encodes a *float64 pointer as a Double.
 // It panics if the pointer is nil.
 func appendDoublePtr(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := **p.Float64Ptr()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendFixed64(b, math.Float64bits(v))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendFixed64(b, math.Float64bits(v))
 	return b, nil
 }
 
 // consumeDoublePtr wire decodes a *float64 pointer as a Double.
-func consumeDoublePtr(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.Fixed64Type {
+func consumeDoublePtr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.Fixed64Type {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeFixed64(b)
+	v, n := protowire.ConsumeFixed64(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	vp := p.Float64Ptr()
 	if *vp == nil {
@@ -4707,7 +4707,7 @@
 // sizeDoubleSlice returns the size of wire encoding a []float64 pointer as a repeated Double.
 func sizeDoubleSlice(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	s := *p.Float64Slice()
-	size = len(s) * (f.tagsize + wire.SizeFixed64())
+	size = len(s) * (f.tagsize + protowire.SizeFixed64())
 	return size
 }
 
@@ -4715,25 +4715,25 @@
 func appendDoubleSlice(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	s := *p.Float64Slice()
 	for _, v := range s {
-		b = wire.AppendVarint(b, f.wiretag)
-		b = wire.AppendFixed64(b, math.Float64bits(v))
+		b = protowire.AppendVarint(b, f.wiretag)
+		b = protowire.AppendFixed64(b, math.Float64bits(v))
 	}
 	return b, nil
 }
 
 // consumeDoubleSlice wire decodes a []float64 pointer as a repeated Double.
-func consumeDoubleSlice(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+func consumeDoubleSlice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
 	sp := p.Float64Slice()
-	if wtyp == wire.BytesType {
+	if wtyp == protowire.BytesType {
 		s := *sp
-		b, n := wire.ConsumeBytes(b)
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return out, wire.ParseError(n)
+			return out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
-			v, n := wire.ConsumeFixed64(b)
+			v, n := protowire.ConsumeFixed64(b)
 			if n < 0 {
-				return out, wire.ParseError(n)
+				return out, protowire.ParseError(n)
 			}
 			s = append(s, math.Float64frombits(v))
 			b = b[n:]
@@ -4742,12 +4742,12 @@
 		out.n = n
 		return out, nil
 	}
-	if wtyp != wire.Fixed64Type {
+	if wtyp != protowire.Fixed64Type {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeFixed64(b)
+	v, n := protowire.ConsumeFixed64(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	*sp = append(*sp, math.Float64frombits(v))
 	out.n = n
@@ -4767,8 +4767,8 @@
 	if len(s) == 0 {
 		return 0
 	}
-	n := len(s) * wire.SizeFixed64()
-	return f.tagsize + wire.SizeBytes(n)
+	n := len(s) * protowire.SizeFixed64()
+	return f.tagsize + protowire.SizeBytes(n)
 }
 
 // appendDoublePackedSlice encodes a []float64 pointer as a packed repeated Double.
@@ -4777,11 +4777,11 @@
 	if len(s) == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
-	n := len(s) * wire.SizeFixed64()
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, f.wiretag)
+	n := len(s) * protowire.SizeFixed64()
+	b = protowire.AppendVarint(b, uint64(n))
 	for _, v := range s {
-		b = wire.AppendFixed64(b, math.Float64bits(v))
+		b = protowire.AppendFixed64(b, math.Float64bits(v))
 	}
 	return b, nil
 }
@@ -4795,24 +4795,24 @@
 
 // sizeDoubleValue returns the size of wire encoding a float64 value as a Double.
 func sizeDoubleValue(v protoreflect.Value, tagsize int, _ marshalOptions) int {
-	return tagsize + wire.SizeFixed64()
+	return tagsize + protowire.SizeFixed64()
 }
 
 // appendDoubleValue encodes a float64 value as a Double.
 func appendDoubleValue(b []byte, v protoreflect.Value, wiretag uint64, _ marshalOptions) ([]byte, error) {
-	b = wire.AppendVarint(b, wiretag)
-	b = wire.AppendFixed64(b, math.Float64bits(v.Float()))
+	b = protowire.AppendVarint(b, wiretag)
+	b = protowire.AppendFixed64(b, math.Float64bits(v.Float()))
 	return b, nil
 }
 
 // consumeDoubleValue decodes a float64 value as a Double.
-func consumeDoubleValue(b []byte, _ protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
-	if wtyp != wire.Fixed64Type {
+func consumeDoubleValue(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+	if wtyp != protowire.Fixed64Type {
 		return protoreflect.Value{}, out, errUnknown
 	}
-	v, n := wire.ConsumeFixed64(b)
+	v, n := protowire.ConsumeFixed64(b)
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	out.n = n
 	return protoreflect.ValueOfFloat64(math.Float64frombits(v)), out, nil
@@ -4828,7 +4828,7 @@
 // sizeDoubleSliceValue returns the size of wire encoding a []float64 value as a repeated Double.
 func sizeDoubleSliceValue(listv protoreflect.Value, tagsize int, _ marshalOptions) (size int) {
 	list := listv.List()
-	size = list.Len() * (tagsize + wire.SizeFixed64())
+	size = list.Len() * (tagsize + protowire.SizeFixed64())
 	return size
 }
 
@@ -4837,24 +4837,24 @@
 	list := listv.List()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendVarint(b, wiretag)
-		b = wire.AppendFixed64(b, math.Float64bits(v.Float()))
+		b = protowire.AppendVarint(b, wiretag)
+		b = protowire.AppendFixed64(b, math.Float64bits(v.Float()))
 	}
 	return b, nil
 }
 
 // consumeDoubleSliceValue wire decodes a []float64 value as a repeated Double.
-func consumeDoubleSliceValue(b []byte, listv protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+func consumeDoubleSliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
 	list := listv.List()
-	if wtyp == wire.BytesType {
-		b, n := wire.ConsumeBytes(b)
+	if wtyp == protowire.BytesType {
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return protoreflect.Value{}, out, wire.ParseError(n)
+			return protoreflect.Value{}, out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
-			v, n := wire.ConsumeFixed64(b)
+			v, n := protowire.ConsumeFixed64(b)
 			if n < 0 {
-				return protoreflect.Value{}, out, wire.ParseError(n)
+				return protoreflect.Value{}, out, protowire.ParseError(n)
 			}
 			list.Append(protoreflect.ValueOfFloat64(math.Float64frombits(v)))
 			b = b[n:]
@@ -4862,12 +4862,12 @@
 		out.n = n
 		return listv, out, nil
 	}
-	if wtyp != wire.Fixed64Type {
+	if wtyp != protowire.Fixed64Type {
 		return protoreflect.Value{}, out, errUnknown
 	}
-	v, n := wire.ConsumeFixed64(b)
+	v, n := protowire.ConsumeFixed64(b)
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	list.Append(protoreflect.ValueOfFloat64(math.Float64frombits(v)))
 	out.n = n
@@ -4888,8 +4888,8 @@
 	if llen == 0 {
 		return 0
 	}
-	n := llen * wire.SizeFixed64()
-	return tagsize + wire.SizeBytes(n)
+	n := llen * protowire.SizeFixed64()
+	return tagsize + protowire.SizeBytes(n)
 }
 
 // appendDoublePackedSliceValue encodes a []float64 value as a packed repeated Double.
@@ -4899,12 +4899,12 @@
 	if llen == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, wiretag)
-	n := llen * wire.SizeFixed64()
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, wiretag)
+	n := llen * protowire.SizeFixed64()
+	b = protowire.AppendVarint(b, uint64(n))
 	for i := 0; i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendFixed64(b, math.Float64bits(v.Float()))
+		b = protowire.AppendFixed64(b, math.Float64bits(v.Float()))
 	}
 	return b, nil
 }
@@ -4919,25 +4919,25 @@
 // sizeString returns the size of wire encoding a string pointer as a String.
 func sizeString(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	v := *p.String()
-	return f.tagsize + wire.SizeBytes(len(v))
+	return f.tagsize + protowire.SizeBytes(len(v))
 }
 
 // appendString wire encodes a string pointer as a String.
 func appendString(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := *p.String()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendString(b, v)
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendString(b, v)
 	return b, nil
 }
 
 // consumeString wire decodes a string pointer as a String.
-func consumeString(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.BytesType {
+func consumeString(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.BytesType {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeString(b)
+	v, n := protowire.ConsumeString(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	*p.String() = v
 	out.n = n
@@ -4954,8 +4954,8 @@
 // appendStringValidateUTF8 wire encodes a string pointer as a String.
 func appendStringValidateUTF8(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := *p.String()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendString(b, v)
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendString(b, v)
 	if !utf8.ValidString(v) {
 		return b, errInvalidUTF8{}
 	}
@@ -4963,13 +4963,13 @@
 }
 
 // consumeStringValidateUTF8 wire decodes a string pointer as a String.
-func consumeStringValidateUTF8(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.BytesType {
+func consumeStringValidateUTF8(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.BytesType {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeString(b)
+	v, n := protowire.ConsumeString(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	if !utf8.ValidString(v) {
 		return out, errInvalidUTF8{}
@@ -4993,7 +4993,7 @@
 	if len(v) == 0 {
 		return 0
 	}
-	return f.tagsize + wire.SizeBytes(len(v))
+	return f.tagsize + protowire.SizeBytes(len(v))
 }
 
 // appendStringNoZero wire encodes a string pointer as a String.
@@ -5003,8 +5003,8 @@
 	if len(v) == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendString(b, v)
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendString(b, v)
 	return b, nil
 }
 
@@ -5022,8 +5022,8 @@
 	if len(v) == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendString(b, v)
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendString(b, v)
 	if !utf8.ValidString(v) {
 		return b, errInvalidUTF8{}
 	}
@@ -5041,26 +5041,26 @@
 // It panics if the pointer is nil.
 func sizeStringPtr(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	v := **p.StringPtr()
-	return f.tagsize + wire.SizeBytes(len(v))
+	return f.tagsize + protowire.SizeBytes(len(v))
 }
 
 // appendStringPtr wire encodes a *string pointer as a String.
 // It panics if the pointer is nil.
 func appendStringPtr(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := **p.StringPtr()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendString(b, v)
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendString(b, v)
 	return b, nil
 }
 
 // consumeStringPtr wire decodes a *string pointer as a String.
-func consumeStringPtr(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.BytesType {
+func consumeStringPtr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.BytesType {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeString(b)
+	v, n := protowire.ConsumeString(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	vp := p.StringPtr()
 	if *vp == nil {
@@ -5082,7 +5082,7 @@
 func sizeStringSlice(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	s := *p.StringSlice()
 	for _, v := range s {
-		size += f.tagsize + wire.SizeBytes(len(v))
+		size += f.tagsize + protowire.SizeBytes(len(v))
 	}
 	return size
 }
@@ -5091,21 +5091,21 @@
 func appendStringSlice(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	s := *p.StringSlice()
 	for _, v := range s {
-		b = wire.AppendVarint(b, f.wiretag)
-		b = wire.AppendString(b, v)
+		b = protowire.AppendVarint(b, f.wiretag)
+		b = protowire.AppendString(b, v)
 	}
 	return b, nil
 }
 
 // consumeStringSlice wire decodes a []string pointer as a repeated String.
-func consumeStringSlice(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+func consumeStringSlice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
 	sp := p.StringSlice()
-	if wtyp != wire.BytesType {
+	if wtyp != protowire.BytesType {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeString(b)
+	v, n := protowire.ConsumeString(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	*sp = append(*sp, v)
 	out.n = n
@@ -5123,8 +5123,8 @@
 func appendStringSliceValidateUTF8(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	s := *p.StringSlice()
 	for _, v := range s {
-		b = wire.AppendVarint(b, f.wiretag)
-		b = wire.AppendString(b, v)
+		b = protowire.AppendVarint(b, f.wiretag)
+		b = protowire.AppendString(b, v)
 		if !utf8.ValidString(v) {
 			return b, errInvalidUTF8{}
 		}
@@ -5133,14 +5133,14 @@
 }
 
 // consumeStringSliceValidateUTF8 wire decodes a []string pointer as a repeated String.
-func consumeStringSliceValidateUTF8(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+func consumeStringSliceValidateUTF8(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
 	sp := p.StringSlice()
-	if wtyp != wire.BytesType {
+	if wtyp != protowire.BytesType {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeString(b)
+	v, n := protowire.ConsumeString(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	if !utf8.ValidString(v) {
 		return out, errInvalidUTF8{}
@@ -5159,24 +5159,24 @@
 
 // sizeStringValue returns the size of wire encoding a string value as a String.
 func sizeStringValue(v protoreflect.Value, tagsize int, _ marshalOptions) int {
-	return tagsize + wire.SizeBytes(len(v.String()))
+	return tagsize + protowire.SizeBytes(len(v.String()))
 }
 
 // appendStringValue encodes a string value as a String.
 func appendStringValue(b []byte, v protoreflect.Value, wiretag uint64, _ marshalOptions) ([]byte, error) {
-	b = wire.AppendVarint(b, wiretag)
-	b = wire.AppendString(b, v.String())
+	b = protowire.AppendVarint(b, wiretag)
+	b = protowire.AppendString(b, v.String())
 	return b, nil
 }
 
 // consumeStringValue decodes a string value as a String.
-func consumeStringValue(b []byte, _ protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
-	if wtyp != wire.BytesType {
+func consumeStringValue(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+	if wtyp != protowire.BytesType {
 		return protoreflect.Value{}, out, errUnknown
 	}
-	v, n := wire.ConsumeString(b)
+	v, n := protowire.ConsumeString(b)
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	out.n = n
 	return protoreflect.ValueOfString(string(v)), out, nil
@@ -5191,8 +5191,8 @@
 
 // appendStringValueValidateUTF8 encodes a string value as a String.
 func appendStringValueValidateUTF8(b []byte, v protoreflect.Value, wiretag uint64, _ marshalOptions) ([]byte, error) {
-	b = wire.AppendVarint(b, wiretag)
-	b = wire.AppendString(b, v.String())
+	b = protowire.AppendVarint(b, wiretag)
+	b = protowire.AppendString(b, v.String())
 	if !utf8.ValidString(v.String()) {
 		return b, errInvalidUTF8{}
 	}
@@ -5200,13 +5200,13 @@
 }
 
 // consumeStringValueValidateUTF8 decodes a string value as a String.
-func consumeStringValueValidateUTF8(b []byte, _ protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
-	if wtyp != wire.BytesType {
+func consumeStringValueValidateUTF8(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+	if wtyp != protowire.BytesType {
 		return protoreflect.Value{}, out, errUnknown
 	}
-	v, n := wire.ConsumeString(b)
+	v, n := protowire.ConsumeString(b)
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	if !utf8.ValidString(v) {
 		return protoreflect.Value{}, out, errInvalidUTF8{}
@@ -5227,7 +5227,7 @@
 	list := listv.List()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		v := list.Get(i)
-		size += tagsize + wire.SizeBytes(len(v.String()))
+		size += tagsize + protowire.SizeBytes(len(v.String()))
 	}
 	return size
 }
@@ -5237,21 +5237,21 @@
 	list := listv.List()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendVarint(b, wiretag)
-		b = wire.AppendString(b, v.String())
+		b = protowire.AppendVarint(b, wiretag)
+		b = protowire.AppendString(b, v.String())
 	}
 	return b, nil
 }
 
 // consumeStringSliceValue wire decodes a []string value as a repeated String.
-func consumeStringSliceValue(b []byte, listv protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+func consumeStringSliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
 	list := listv.List()
-	if wtyp != wire.BytesType {
+	if wtyp != protowire.BytesType {
 		return protoreflect.Value{}, out, errUnknown
 	}
-	v, n := wire.ConsumeString(b)
+	v, n := protowire.ConsumeString(b)
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	list.Append(protoreflect.ValueOfString(string(v)))
 	out.n = n
@@ -5268,25 +5268,25 @@
 // sizeBytes returns the size of wire encoding a []byte pointer as a Bytes.
 func sizeBytes(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	v := *p.Bytes()
-	return f.tagsize + wire.SizeBytes(len(v))
+	return f.tagsize + protowire.SizeBytes(len(v))
 }
 
 // appendBytes wire encodes a []byte pointer as a Bytes.
 func appendBytes(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := *p.Bytes()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendBytes(b, v)
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendBytes(b, v)
 	return b, nil
 }
 
 // consumeBytes wire decodes a []byte pointer as a Bytes.
-func consumeBytes(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.BytesType {
+func consumeBytes(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.BytesType {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeBytes(b)
+	v, n := protowire.ConsumeBytes(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	*p.Bytes() = append(emptyBuf[:], v...)
 	out.n = n
@@ -5303,8 +5303,8 @@
 // appendBytesValidateUTF8 wire encodes a []byte pointer as a Bytes.
 func appendBytesValidateUTF8(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	v := *p.Bytes()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendBytes(b, v)
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendBytes(b, v)
 	if !utf8.Valid(v) {
 		return b, errInvalidUTF8{}
 	}
@@ -5312,13 +5312,13 @@
 }
 
 // consumeBytesValidateUTF8 wire decodes a []byte pointer as a Bytes.
-func consumeBytesValidateUTF8(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.BytesType {
+func consumeBytesValidateUTF8(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.BytesType {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeBytes(b)
+	v, n := protowire.ConsumeBytes(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	if !utf8.Valid(v) {
 		return out, errInvalidUTF8{}
@@ -5342,7 +5342,7 @@
 	if len(v) == 0 {
 		return 0
 	}
-	return f.tagsize + wire.SizeBytes(len(v))
+	return f.tagsize + protowire.SizeBytes(len(v))
 }
 
 // appendBytesNoZero wire encodes a []byte pointer as a Bytes.
@@ -5352,20 +5352,20 @@
 	if len(v) == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendBytes(b, v)
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendBytes(b, v)
 	return b, nil
 }
 
 // consumeBytesNoZero wire decodes a []byte pointer as a Bytes.
 // The zero value is not decoded.
-func consumeBytesNoZero(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.BytesType {
+func consumeBytesNoZero(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.BytesType {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeBytes(b)
+	v, n := protowire.ConsumeBytes(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	*p.Bytes() = append(([]byte)(nil), v...)
 	out.n = n
@@ -5386,8 +5386,8 @@
 	if len(v) == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendBytes(b, v)
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendBytes(b, v)
 	if !utf8.Valid(v) {
 		return b, errInvalidUTF8{}
 	}
@@ -5395,13 +5395,13 @@
 }
 
 // consumeBytesNoZeroValidateUTF8 wire decodes a []byte pointer as a Bytes.
-func consumeBytesNoZeroValidateUTF8(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.BytesType {
+func consumeBytesNoZeroValidateUTF8(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.BytesType {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeBytes(b)
+	v, n := protowire.ConsumeBytes(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	if !utf8.Valid(v) {
 		return out, errInvalidUTF8{}
@@ -5422,7 +5422,7 @@
 func sizeBytesSlice(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	s := *p.BytesSlice()
 	for _, v := range s {
-		size += f.tagsize + wire.SizeBytes(len(v))
+		size += f.tagsize + protowire.SizeBytes(len(v))
 	}
 	return size
 }
@@ -5431,21 +5431,21 @@
 func appendBytesSlice(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	s := *p.BytesSlice()
 	for _, v := range s {
-		b = wire.AppendVarint(b, f.wiretag)
-		b = wire.AppendBytes(b, v)
+		b = protowire.AppendVarint(b, f.wiretag)
+		b = protowire.AppendBytes(b, v)
 	}
 	return b, nil
 }
 
 // consumeBytesSlice wire decodes a [][]byte pointer as a repeated Bytes.
-func consumeBytesSlice(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+func consumeBytesSlice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
 	sp := p.BytesSlice()
-	if wtyp != wire.BytesType {
+	if wtyp != protowire.BytesType {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeBytes(b)
+	v, n := protowire.ConsumeBytes(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	*sp = append(*sp, append(emptyBuf[:], v...))
 	out.n = n
@@ -5463,8 +5463,8 @@
 func appendBytesSliceValidateUTF8(b []byte, p pointer, f *coderFieldInfo, _ marshalOptions) ([]byte, error) {
 	s := *p.BytesSlice()
 	for _, v := range s {
-		b = wire.AppendVarint(b, f.wiretag)
-		b = wire.AppendBytes(b, v)
+		b = protowire.AppendVarint(b, f.wiretag)
+		b = protowire.AppendBytes(b, v)
 		if !utf8.Valid(v) {
 			return b, errInvalidUTF8{}
 		}
@@ -5473,14 +5473,14 @@
 }
 
 // consumeBytesSliceValidateUTF8 wire decodes a [][]byte pointer as a repeated Bytes.
-func consumeBytesSliceValidateUTF8(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+func consumeBytesSliceValidateUTF8(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
 	sp := p.BytesSlice()
-	if wtyp != wire.BytesType {
+	if wtyp != protowire.BytesType {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeBytes(b)
+	v, n := protowire.ConsumeBytes(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	if !utf8.Valid(v) {
 		return out, errInvalidUTF8{}
@@ -5499,24 +5499,24 @@
 
 // sizeBytesValue returns the size of wire encoding a []byte value as a Bytes.
 func sizeBytesValue(v protoreflect.Value, tagsize int, _ marshalOptions) int {
-	return tagsize + wire.SizeBytes(len(v.Bytes()))
+	return tagsize + protowire.SizeBytes(len(v.Bytes()))
 }
 
 // appendBytesValue encodes a []byte value as a Bytes.
 func appendBytesValue(b []byte, v protoreflect.Value, wiretag uint64, _ marshalOptions) ([]byte, error) {
-	b = wire.AppendVarint(b, wiretag)
-	b = wire.AppendBytes(b, v.Bytes())
+	b = protowire.AppendVarint(b, wiretag)
+	b = protowire.AppendBytes(b, v.Bytes())
 	return b, nil
 }
 
 // consumeBytesValue decodes a []byte value as a Bytes.
-func consumeBytesValue(b []byte, _ protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
-	if wtyp != wire.BytesType {
+func consumeBytesValue(b []byte, _ protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+	if wtyp != protowire.BytesType {
 		return protoreflect.Value{}, out, errUnknown
 	}
-	v, n := wire.ConsumeBytes(b)
+	v, n := protowire.ConsumeBytes(b)
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	out.n = n
 	return protoreflect.ValueOfBytes(append(emptyBuf[:], v...)), out, nil
@@ -5534,7 +5534,7 @@
 	list := listv.List()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		v := list.Get(i)
-		size += tagsize + wire.SizeBytes(len(v.Bytes()))
+		size += tagsize + protowire.SizeBytes(len(v.Bytes()))
 	}
 	return size
 }
@@ -5544,21 +5544,21 @@
 	list := listv.List()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		v := list.Get(i)
-		b = wire.AppendVarint(b, wiretag)
-		b = wire.AppendBytes(b, v.Bytes())
+		b = protowire.AppendVarint(b, wiretag)
+		b = protowire.AppendBytes(b, v.Bytes())
 	}
 	return b, nil
 }
 
 // consumeBytesSliceValue wire decodes a [][]byte value as a repeated Bytes.
-func consumeBytesSliceValue(b []byte, listv protoreflect.Value, _ wire.Number, wtyp wire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
+func consumeBytesSliceValue(b []byte, listv protoreflect.Value, _ protowire.Number, wtyp protowire.Type, _ unmarshalOptions) (_ protoreflect.Value, out unmarshalOutput, err error) {
 	list := listv.List()
-	if wtyp != wire.BytesType {
+	if wtyp != protowire.BytesType {
 		return protoreflect.Value{}, out, errUnknown
 	}
-	v, n := wire.ConsumeBytes(b)
+	v, n := protowire.ConsumeBytes(b)
 	if n < 0 {
-		return protoreflect.Value{}, out, wire.ParseError(n)
+		return protoreflect.Value{}, out, protowire.ParseError(n)
 	}
 	list.Append(protoreflect.ValueOfBytes(append(emptyBuf[:], v...)))
 	out.n = n
@@ -5575,23 +5575,23 @@
 // We append to an empty array rather than a nil []byte to get non-nil zero-length byte slices.
 var emptyBuf [0]byte
 
-var wireTypes = map[protoreflect.Kind]wire.Type{
-	protoreflect.BoolKind:     wire.VarintType,
-	protoreflect.EnumKind:     wire.VarintType,
-	protoreflect.Int32Kind:    wire.VarintType,
-	protoreflect.Sint32Kind:   wire.VarintType,
-	protoreflect.Uint32Kind:   wire.VarintType,
-	protoreflect.Int64Kind:    wire.VarintType,
-	protoreflect.Sint64Kind:   wire.VarintType,
-	protoreflect.Uint64Kind:   wire.VarintType,
-	protoreflect.Sfixed32Kind: wire.Fixed32Type,
-	protoreflect.Fixed32Kind:  wire.Fixed32Type,
-	protoreflect.FloatKind:    wire.Fixed32Type,
-	protoreflect.Sfixed64Kind: wire.Fixed64Type,
-	protoreflect.Fixed64Kind:  wire.Fixed64Type,
-	protoreflect.DoubleKind:   wire.Fixed64Type,
-	protoreflect.StringKind:   wire.BytesType,
-	protoreflect.BytesKind:    wire.BytesType,
-	protoreflect.MessageKind:  wire.BytesType,
-	protoreflect.GroupKind:    wire.StartGroupType,
+var wireTypes = map[protoreflect.Kind]protowire.Type{
+	protoreflect.BoolKind:     protowire.VarintType,
+	protoreflect.EnumKind:     protowire.VarintType,
+	protoreflect.Int32Kind:    protowire.VarintType,
+	protoreflect.Sint32Kind:   protowire.VarintType,
+	protoreflect.Uint32Kind:   protowire.VarintType,
+	protoreflect.Int64Kind:    protowire.VarintType,
+	protoreflect.Sint64Kind:   protowire.VarintType,
+	protoreflect.Uint64Kind:   protowire.VarintType,
+	protoreflect.Sfixed32Kind: protowire.Fixed32Type,
+	protoreflect.Fixed32Kind:  protowire.Fixed32Type,
+	protoreflect.FloatKind:    protowire.Fixed32Type,
+	protoreflect.Sfixed64Kind: protowire.Fixed64Type,
+	protoreflect.Fixed64Kind:  protowire.Fixed64Type,
+	protoreflect.DoubleKind:   protowire.Fixed64Type,
+	protoreflect.StringKind:   protowire.BytesType,
+	protoreflect.BytesKind:    protowire.BytesType,
+	protoreflect.MessageKind:  protowire.BytesType,
+	protoreflect.GroupKind:    protowire.StartGroupType,
 }
diff --git a/internal/impl/codec_map.go b/internal/impl/codec_map.go
index dd5f8c7..35a67c2 100644
--- a/internal/impl/codec_map.go
+++ b/internal/impl/codec_map.go
@@ -9,7 +9,7 @@
 	"reflect"
 	"sort"
 
-	"google.golang.org/protobuf/internal/encoding/wire"
+	"google.golang.org/protobuf/encoding/protowire"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
 )
 
@@ -28,8 +28,8 @@
 	// TODO: Consider generating specialized map coders.
 	keyField := fd.MapKey()
 	valField := fd.MapValue()
-	keyWiretag := wire.EncodeTag(1, wireTypes[keyField.Kind()])
-	valWiretag := wire.EncodeTag(2, wireTypes[valField.Kind()])
+	keyWiretag := protowire.EncodeTag(1, wireTypes[keyField.Kind()])
+	valWiretag := protowire.EncodeTag(2, wireTypes[valField.Kind()])
 	keyFuncs := encoderFuncsForValue(keyField)
 	valFuncs := encoderFuncsForValue(valField)
 	conv := newMapConverter(ft, fd)
@@ -55,7 +55,7 @@
 		marshal: func(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
 			return appendMap(b, p.AsValueOf(ft).Elem(), mapi, f, opts)
 		},
-		unmarshal: func(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
+		unmarshal: func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error) {
 			mp := p.AsValueOf(ft)
 			if mp.Elem().IsNil() {
 				mp.Elem().Set(reflect.MakeMap(mapi.goType))
@@ -104,31 +104,31 @@
 		} else {
 			p := pointerOfValue(iter.Value())
 			valSize += mapValTagSize
-			valSize += wire.SizeBytes(f.mi.sizePointer(p, opts))
+			valSize += protowire.SizeBytes(f.mi.sizePointer(p, opts))
 		}
-		n += f.tagsize + wire.SizeBytes(keySize+valSize)
+		n += f.tagsize + protowire.SizeBytes(keySize+valSize)
 	}
 	return n
 }
 
-func consumeMap(b []byte, mapv reflect.Value, wtyp wire.Type, mapi *mapInfo, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.BytesType {
+func consumeMap(b []byte, mapv reflect.Value, wtyp protowire.Type, mapi *mapInfo, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.BytesType {
 		return out, errUnknown
 	}
-	b, n := wire.ConsumeBytes(b)
+	b, n := protowire.ConsumeBytes(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	var (
 		key = mapi.keyZero
 		val = mapi.conv.valConv.New()
 	)
 	for len(b) > 0 {
-		num, wtyp, n := wire.ConsumeTag(b)
+		num, wtyp, n := protowire.ConsumeTag(b)
 		if n < 0 {
-			return out, wire.ParseError(n)
+			return out, protowire.ParseError(n)
 		}
-		if num > wire.MaxValidNumber {
+		if num > protowire.MaxValidNumber {
 			return out, errors.New("invalid field number")
 		}
 		b = b[n:]
@@ -154,9 +154,9 @@
 			n = o.n
 		}
 		if err == errUnknown {
-			n = wire.ConsumeFieldValue(num, wtyp, b)
+			n = protowire.ConsumeFieldValue(num, wtyp, b)
 			if n < 0 {
-				return out, wire.ParseError(n)
+				return out, protowire.ParseError(n)
 			}
 		} else if err != nil {
 			return out, err
@@ -168,24 +168,24 @@
 	return out, nil
 }
 
-func consumeMapOfMessage(b []byte, mapv reflect.Value, wtyp wire.Type, mapi *mapInfo, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.BytesType {
+func consumeMapOfMessage(b []byte, mapv reflect.Value, wtyp protowire.Type, mapi *mapInfo, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.BytesType {
 		return out, errUnknown
 	}
-	b, n := wire.ConsumeBytes(b)
+	b, n := protowire.ConsumeBytes(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	var (
 		key = mapi.keyZero
 		val = reflect.New(f.mi.GoReflectType.Elem())
 	)
 	for len(b) > 0 {
-		num, wtyp, n := wire.ConsumeTag(b)
+		num, wtyp, n := protowire.ConsumeTag(b)
 		if n < 0 {
-			return out, wire.ParseError(n)
+			return out, protowire.ParseError(n)
 		}
-		if num > wire.MaxValidNumber {
+		if num > protowire.MaxValidNumber {
 			return out, errors.New("invalid field number")
 		}
 		b = b[n:]
@@ -201,13 +201,13 @@
 			key = v
 			n = o.n
 		case 2:
-			if wtyp != wire.BytesType {
+			if wtyp != protowire.BytesType {
 				break
 			}
 			var v []byte
-			v, n = wire.ConsumeBytes(b)
+			v, n = protowire.ConsumeBytes(b)
 			if n < 0 {
-				return out, wire.ParseError(n)
+				return out, protowire.ParseError(n)
 			}
 			var o unmarshalOutput
 			o, err = f.mi.unmarshalPointer(v, pointerOfValue(val), 0, opts)
@@ -218,9 +218,9 @@
 			}
 		}
 		if err == errUnknown {
-			n = wire.ConsumeFieldValue(num, wtyp, b)
+			n = protowire.ConsumeFieldValue(num, wtyp, b)
 			if n < 0 {
-				return out, wire.ParseError(n)
+				return out, protowire.ParseError(n)
 			}
 		} else if err != nil {
 			return out, err
@@ -239,7 +239,7 @@
 		size := 0
 		size += mapi.keyFuncs.size(key.Value(), mapKeyTagSize, opts)
 		size += mapi.valFuncs.size(val, mapValTagSize, opts)
-		b = wire.AppendVarint(b, uint64(size))
+		b = protowire.AppendVarint(b, uint64(size))
 		b, err := mapi.keyFuncs.marshal(b, key.Value(), mapi.keyWiretag, opts)
 		if err != nil {
 			return nil, err
@@ -251,14 +251,14 @@
 		valSize := f.mi.sizePointer(val, opts)
 		size := 0
 		size += mapi.keyFuncs.size(key.Value(), mapKeyTagSize, opts)
-		size += mapValTagSize + wire.SizeBytes(valSize)
-		b = wire.AppendVarint(b, uint64(size))
+		size += mapValTagSize + protowire.SizeBytes(valSize)
+		b = protowire.AppendVarint(b, uint64(size))
 		b, err := mapi.keyFuncs.marshal(b, key.Value(), mapi.keyWiretag, opts)
 		if err != nil {
 			return nil, err
 		}
-		b = wire.AppendVarint(b, mapi.valWiretag)
-		b = wire.AppendVarint(b, uint64(valSize))
+		b = protowire.AppendVarint(b, mapi.valWiretag)
+		b = protowire.AppendVarint(b, uint64(valSize))
 		return f.mi.marshalAppendPointer(b, val, opts)
 	}
 }
@@ -273,7 +273,7 @@
 	iter := mapRange(mapv)
 	for iter.Next() {
 		var err error
-		b = wire.AppendVarint(b, f.wiretag)
+		b = protowire.AppendVarint(b, f.wiretag)
 		b, err = appendMapItem(b, iter.Key(), iter.Value(), mapi, f, opts)
 		if err != nil {
 			return b, err
@@ -302,7 +302,7 @@
 	})
 	for _, key := range keys {
 		var err error
-		b = wire.AppendVarint(b, f.wiretag)
+		b = protowire.AppendVarint(b, f.wiretag)
 		b, err = appendMapItem(b, key, mapv.MapIndex(key), mapi, f, opts)
 		if err != nil {
 			return b, err
diff --git a/internal/impl/codec_message.go b/internal/impl/codec_message.go
index a86468a..370ec65 100644
--- a/internal/impl/codec_message.go
+++ b/internal/impl/codec_message.go
@@ -9,8 +9,8 @@
 	"reflect"
 	"sort"
 
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/internal/encoding/messageset"
-	"google.golang.org/protobuf/internal/encoding/wire"
 	"google.golang.org/protobuf/internal/fieldsort"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
 	piface "google.golang.org/protobuf/runtime/protoiface"
@@ -24,7 +24,7 @@
 
 	orderedCoderFields []*coderFieldInfo
 	denseCoderFields   []*coderFieldInfo
-	coderFields        map[wire.Number]*coderFieldInfo
+	coderFields        map[protowire.Number]*coderFieldInfo
 	sizecacheOffset    offset
 	unknownOffset      offset
 	extensionOffset    offset
@@ -51,7 +51,7 @@
 	mi.unknownOffset = si.unknownOffset
 	mi.extensionOffset = si.extensionOffset
 
-	mi.coderFields = make(map[wire.Number]*coderFieldInfo)
+	mi.coderFields = make(map[protowire.Number]*coderFieldInfo)
 	fields := mi.Desc.Fields()
 	for i := 0; i < fields.Len(); i++ {
 		fd := fields.Get(i)
@@ -63,9 +63,9 @@
 		ft := fs.Type
 		var wiretag uint64
 		if !fd.IsPacked() {
-			wiretag = wire.EncodeTag(fd.Number(), wireTypes[fd.Kind()])
+			wiretag = protowire.EncodeTag(fd.Number(), wireTypes[fd.Kind()])
 		} else {
-			wiretag = wire.EncodeTag(fd.Number(), wire.BytesType)
+			wiretag = protowire.EncodeTag(fd.Number(), protowire.BytesType)
 		}
 		var fieldOffset offset
 		var funcs pointerCoderFuncs
@@ -85,7 +85,7 @@
 			offset:     fieldOffset,
 			wiretag:    wiretag,
 			ft:         ft,
-			tagsize:    wire.SizeVarint(wiretag),
+			tagsize:    protowire.SizeVarint(wiretag),
 			funcs:      funcs,
 			mi:         childMessage,
 			validation: newFieldValidationInfo(mi, si, fd, ft),
diff --git a/internal/impl/codec_messageset.go b/internal/impl/codec_messageset.go
index 432cb49..cfb68e1 100644
--- a/internal/impl/codec_messageset.go
+++ b/internal/impl/codec_messageset.go
@@ -7,8 +7,8 @@
 import (
 	"sort"
 
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/internal/encoding/messageset"
-	"google.golang.org/protobuf/internal/encoding/wire"
 	"google.golang.org/protobuf/internal/errors"
 	"google.golang.org/protobuf/internal/flags"
 )
@@ -24,9 +24,9 @@
 		if xi.funcs.size == nil {
 			continue
 		}
-		num, _ := wire.DecodeTag(xi.wiretag)
+		num, _ := protowire.DecodeTag(xi.wiretag)
 		size += messageset.SizeField(num)
-		size += xi.funcs.size(x.Value(), wire.SizeTag(messageset.FieldMessage), opts)
+		size += xi.funcs.size(x.Value(), protowire.SizeTag(messageset.FieldMessage), opts)
 	}
 
 	unknown := *p.Apply(mi.unknownOffset).Bytes()
@@ -80,9 +80,9 @@
 
 func marshalMessageSetField(mi *MessageInfo, b []byte, x ExtensionField, opts marshalOptions) ([]byte, error) {
 	xi := getExtensionFieldInfo(x.Type())
-	num, _ := wire.DecodeTag(xi.wiretag)
+	num, _ := protowire.DecodeTag(xi.wiretag)
 	b = messageset.AppendFieldStart(b, num)
-	b, err := xi.funcs.marshal(b, x.Value(), wire.EncodeTag(messageset.FieldMessage, wire.BytesType), opts)
+	b, err := xi.funcs.marshal(b, x.Value(), protowire.EncodeTag(messageset.FieldMessage, protowire.BytesType), opts)
 	if err != nil {
 		return b, err
 	}
@@ -102,10 +102,10 @@
 	ext := *ep
 	unknown := p.Apply(mi.unknownOffset).Bytes()
 	initialized := true
-	err = messageset.Unmarshal(b, true, func(num wire.Number, v []byte) error {
-		o, err := mi.unmarshalExtension(v, num, wire.BytesType, ext, opts)
+	err = messageset.Unmarshal(b, true, func(num protowire.Number, v []byte) error {
+		o, err := mi.unmarshalExtension(v, num, protowire.BytesType, ext, opts)
 		if err == errUnknown {
-			*unknown = wire.AppendTag(*unknown, num, wire.BytesType)
+			*unknown = protowire.AppendTag(*unknown, num, protowire.BytesType)
 			*unknown = append(*unknown, v...)
 			return nil
 		}
diff --git a/internal/impl/codec_reflect.go b/internal/impl/codec_reflect.go
index 85811b0..86f7dc3 100644
--- a/internal/impl/codec_reflect.go
+++ b/internal/impl/codec_reflect.go
@@ -9,28 +9,28 @@
 import (
 	"reflect"
 
-	"google.golang.org/protobuf/internal/encoding/wire"
+	"google.golang.org/protobuf/encoding/protowire"
 )
 
 func sizeEnum(p pointer, f *coderFieldInfo, _ marshalOptions) (size int) {
 	v := p.v.Elem().Int()
-	return f.tagsize + wire.SizeVarint(uint64(v))
+	return f.tagsize + protowire.SizeVarint(uint64(v))
 }
 
 func appendEnum(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
 	v := p.v.Elem().Int()
-	b = wire.AppendVarint(b, f.wiretag)
-	b = wire.AppendVarint(b, uint64(v))
+	b = protowire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, uint64(v))
 	return b, nil
 }
 
-func consumeEnum(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.VarintType {
+func consumeEnum(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, _ unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.VarintType {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeVarint(b)
+	v, n := protowire.ConsumeVarint(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	p.v.Elem().SetInt(int64(v))
 	out.n = n
@@ -83,8 +83,8 @@
 	return appendEnum(b, pointer{p.v.Elem()}, f, opts)
 }
 
-func consumeEnumPtr(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
-	if wtyp != wire.VarintType {
+func consumeEnumPtr(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
+	if wtyp != protowire.VarintType {
 		return out, errUnknown
 	}
 	if p.v.Elem().IsNil() {
@@ -111,7 +111,7 @@
 func sizeEnumSlice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) {
 	s := p.v.Elem()
 	for i, llen := 0, s.Len(); i < llen; i++ {
-		size += wire.SizeVarint(uint64(s.Index(i).Int())) + f.tagsize
+		size += protowire.SizeVarint(uint64(s.Index(i).Int())) + f.tagsize
 	}
 	return size
 }
@@ -119,23 +119,23 @@
 func appendEnumSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
 	s := p.v.Elem()
 	for i, llen := 0, s.Len(); i < llen; i++ {
-		b = wire.AppendVarint(b, f.wiretag)
-		b = wire.AppendVarint(b, uint64(s.Index(i).Int()))
+		b = protowire.AppendVarint(b, f.wiretag)
+		b = protowire.AppendVarint(b, uint64(s.Index(i).Int()))
 	}
 	return b, nil
 }
 
-func consumeEnumSlice(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
+func consumeEnumSlice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) {
 	s := p.v.Elem()
-	if wtyp == wire.BytesType {
-		b, n := wire.ConsumeBytes(b)
+	if wtyp == protowire.BytesType {
+		b, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return out, wire.ParseError(n)
+			return out, protowire.ParseError(n)
 		}
 		for len(b) > 0 {
-			v, n := wire.ConsumeVarint(b)
+			v, n := protowire.ConsumeVarint(b)
 			if n < 0 {
-				return out, wire.ParseError(n)
+				return out, protowire.ParseError(n)
 			}
 			rv := reflect.New(s.Type().Elem()).Elem()
 			rv.SetInt(int64(v))
@@ -145,12 +145,12 @@
 		out.n = n
 		return out, nil
 	}
-	if wtyp != wire.VarintType {
+	if wtyp != protowire.VarintType {
 		return out, errUnknown
 	}
-	v, n := wire.ConsumeVarint(b)
+	v, n := protowire.ConsumeVarint(b)
 	if n < 0 {
-		return out, wire.ParseError(n)
+		return out, protowire.ParseError(n)
 	}
 	rv := reflect.New(s.Type().Elem()).Elem()
 	rv.SetInt(int64(v))
@@ -178,9 +178,9 @@
 	}
 	n := 0
 	for i := 0; i < llen; i++ {
-		n += wire.SizeVarint(uint64(s.Index(i).Int()))
+		n += protowire.SizeVarint(uint64(s.Index(i).Int()))
 	}
-	return f.tagsize + wire.SizeBytes(n)
+	return f.tagsize + protowire.SizeBytes(n)
 }
 
 func appendEnumPackedSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) {
@@ -189,14 +189,14 @@
 	if llen == 0 {
 		return b, nil
 	}
-	b = wire.AppendVarint(b, f.wiretag)
+	b = protowire.AppendVarint(b, f.wiretag)
 	n := 0
 	for i := 0; i < llen; i++ {
-		n += wire.SizeVarint(uint64(s.Index(i).Int()))
+		n += protowire.SizeVarint(uint64(s.Index(i).Int()))
 	}
-	b = wire.AppendVarint(b, uint64(n))
+	b = protowire.AppendVarint(b, uint64(n))
 	for i := 0; i < llen; i++ {
-		b = wire.AppendVarint(b, uint64(s.Index(i).Int()))
+		b = protowire.AppendVarint(b, uint64(s.Index(i).Int()))
 	}
 	return b, nil
 }
diff --git a/internal/impl/codec_tables.go b/internal/impl/codec_tables.go
index ef30356..c934c8d 100644
--- a/internal/impl/codec_tables.go
+++ b/internal/impl/codec_tables.go
@@ -8,7 +8,7 @@
 	"fmt"
 	"reflect"
 
-	"google.golang.org/protobuf/internal/encoding/wire"
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/internal/strs"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
 )
@@ -18,7 +18,7 @@
 	mi        *MessageInfo
 	size      func(p pointer, f *coderFieldInfo, opts marshalOptions) int
 	marshal   func(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error)
-	unmarshal func(b []byte, p pointer, wtyp wire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error)
+	unmarshal func(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (unmarshalOutput, error)
 	isInit    func(p pointer, f *coderFieldInfo) error
 	merge     func(dst, src pointer, f *coderFieldInfo, opts mergeOptions)
 }
@@ -27,7 +27,7 @@
 type valueCoderFuncs struct {
 	size      func(v pref.Value, tagsize int, opts marshalOptions) int
 	marshal   func(b []byte, v pref.Value, wiretag uint64, opts marshalOptions) ([]byte, error)
-	unmarshal func(b []byte, v pref.Value, num wire.Number, wtyp wire.Type, opts unmarshalOptions) (pref.Value, unmarshalOutput, error)
+	unmarshal func(b []byte, v pref.Value, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (pref.Value, unmarshalOutput, error)
 	isInit    func(v pref.Value) error
 	merge     func(dst, src pref.Value, opts mergeOptions) pref.Value
 }
diff --git a/internal/impl/decode.go b/internal/impl/decode.go
index 5a19f23..85ba1d3 100644
--- a/internal/impl/decode.go
+++ b/internal/impl/decode.go
@@ -7,7 +7,7 @@
 import (
 	"math/bits"
 
-	"google.golang.org/protobuf/internal/encoding/wire"
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/internal/errors"
 	"google.golang.org/protobuf/internal/flags"
 	"google.golang.org/protobuf/proto"
@@ -78,7 +78,7 @@
 // This is a sentinel error which should never be visible to the user.
 var errUnknown = errors.New("unknown")
 
-func (mi *MessageInfo) unmarshalPointer(b []byte, p pointer, groupTag wire.Number, opts unmarshalOptions) (out unmarshalOutput, err error) {
+func (mi *MessageInfo) unmarshalPointer(b []byte, p pointer, groupTag protowire.Number, opts unmarshalOptions) (out unmarshalOutput, err error) {
 	mi.init()
 	if flags.ProtoLegacy && mi.isMessageSet {
 		return unmarshalMessageSet(mi, b, p, opts)
@@ -98,21 +98,21 @@
 			b = b[2:]
 		} else {
 			var n int
-			tag, n = wire.ConsumeVarint(b)
+			tag, n = protowire.ConsumeVarint(b)
 			if n < 0 {
-				return out, wire.ParseError(n)
+				return out, protowire.ParseError(n)
 			}
 			b = b[n:]
 		}
-		var num wire.Number
-		if n := tag >> 3; n < uint64(wire.MinValidNumber) || n > uint64(wire.MaxValidNumber) {
+		var num protowire.Number
+		if n := tag >> 3; n < uint64(protowire.MinValidNumber) || n > uint64(protowire.MaxValidNumber) {
 			return out, errors.New("invalid field number")
 		} else {
-			num = wire.Number(n)
+			num = protowire.Number(n)
 		}
-		wtyp := wire.Type(tag & 7)
+		wtyp := protowire.Type(tag & 7)
 
-		if wtyp == wire.EndGroupType {
+		if wtyp == protowire.EndGroupType {
 			if num != groupTag {
 				return out, errors.New("mismatching end group marker")
 			}
@@ -168,13 +168,13 @@
 			if err != errUnknown {
 				return out, err
 			}
-			n = wire.ConsumeFieldValue(num, wtyp, b)
+			n = protowire.ConsumeFieldValue(num, wtyp, b)
 			if n < 0 {
-				return out, wire.ParseError(n)
+				return out, protowire.ParseError(n)
 			}
 			if !opts.DiscardUnknown() && mi.unknownOffset.IsValid() {
 				u := p.Apply(mi.unknownOffset).Bytes()
-				*u = wire.AppendTag(*u, num, wtyp)
+				*u = protowire.AppendTag(*u, num, wtyp)
 				*u = append(*u, b[:n]...)
 			}
 		}
@@ -193,7 +193,7 @@
 	return out, nil
 }
 
-func (mi *MessageInfo) unmarshalExtension(b []byte, num wire.Number, wtyp wire.Type, exts map[int32]ExtensionField, opts unmarshalOptions) (out unmarshalOutput, err error) {
+func (mi *MessageInfo) unmarshalExtension(b []byte, num protowire.Number, wtyp protowire.Type, exts map[int32]ExtensionField, opts unmarshalOptions) (out unmarshalOutput, err error) {
 	x := exts[int32(num)]
 	xt := x.Type()
 	if xt == nil {
@@ -245,17 +245,17 @@
 	return out, nil
 }
 
-func skipExtension(b []byte, xi *extensionFieldInfo, num wire.Number, wtyp wire.Type, opts unmarshalOptions) (out unmarshalOutput, _ ValidationStatus) {
+func skipExtension(b []byte, xi *extensionFieldInfo, num protowire.Number, wtyp protowire.Type, opts unmarshalOptions) (out unmarshalOutput, _ ValidationStatus) {
 	if xi.validation.mi == nil {
 		return out, ValidationUnknown
 	}
 	xi.validation.mi.init()
 	switch xi.validation.typ {
 	case validationTypeMessage:
-		if wtyp != wire.BytesType {
+		if wtyp != protowire.BytesType {
 			return out, ValidationUnknown
 		}
-		v, n := wire.ConsumeBytes(b)
+		v, n := protowire.ConsumeBytes(b)
 		if n < 0 {
 			return out, ValidationUnknown
 		}
@@ -263,7 +263,7 @@
 		out.n = n
 		return out, st
 	case validationTypeGroup:
-		if wtyp != wire.StartGroupType {
+		if wtyp != protowire.StartGroupType {
 			return out, ValidationUnknown
 		}
 		out, st := xi.validation.mi.validate(b, num, opts)
diff --git a/internal/impl/validate.go b/internal/impl/validate.go
index c0148ab..39d62fd 100644
--- a/internal/impl/validate.go
+++ b/internal/impl/validate.go
@@ -11,8 +11,8 @@
 	"reflect"
 	"unicode/utf8"
 
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/internal/encoding/messageset"
-	"google.golang.org/protobuf/internal/encoding/wire"
 	"google.golang.org/protobuf/internal/flags"
 	"google.golang.org/protobuf/internal/strs"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
@@ -163,11 +163,11 @@
 			}
 		default:
 			switch wireTypes[fd.Kind()] {
-			case wire.VarintType:
+			case protowire.VarintType:
 				vi.typ = validationTypeRepeatedVarint
-			case wire.Fixed32Type:
+			case protowire.Fixed32Type:
 				vi.typ = validationTypeRepeatedFixed32
-			case wire.Fixed64Type:
+			case protowire.Fixed64Type:
 				vi.typ = validationTypeRepeatedFixed64
 			}
 		}
@@ -207,13 +207,13 @@
 			}
 		default:
 			switch wireTypes[fd.Kind()] {
-			case wire.VarintType:
+			case protowire.VarintType:
 				vi.typ = validationTypeVarint
-			case wire.Fixed32Type:
+			case protowire.Fixed32Type:
 				vi.typ = validationTypeFixed32
-			case wire.Fixed64Type:
+			case protowire.Fixed64Type:
 				vi.typ = validationTypeFixed64
-			case wire.BytesType:
+			case protowire.BytesType:
 				vi.typ = validationTypeBytes
 			}
 		}
@@ -221,12 +221,12 @@
 	return vi
 }
 
-func (mi *MessageInfo) validate(b []byte, groupTag wire.Number, opts unmarshalOptions) (out unmarshalOutput, result ValidationStatus) {
+func (mi *MessageInfo) validate(b []byte, groupTag protowire.Number, opts unmarshalOptions) (out unmarshalOutput, result ValidationStatus) {
 	mi.init()
 	type validationState struct {
 		typ              validationType
 		keyType, valType validationType
-		endGroup         wire.Number
+		endGroup         protowire.Number
 		mi               *MessageInfo
 		tail             []byte
 		requiredMask     uint64
@@ -258,21 +258,21 @@
 				b = b[2:]
 			} else {
 				var n int
-				tag, n = wire.ConsumeVarint(b)
+				tag, n = protowire.ConsumeVarint(b)
 				if n < 0 {
 					return out, ValidationInvalid
 				}
 				b = b[n:]
 			}
-			var num wire.Number
-			if n := tag >> 3; n < uint64(wire.MinValidNumber) || n > uint64(wire.MaxValidNumber) {
+			var num protowire.Number
+			if n := tag >> 3; n < uint64(protowire.MinValidNumber) || n > uint64(protowire.MaxValidNumber) {
 				return out, ValidationInvalid
 			} else {
-				num = wire.Number(n)
+				num = protowire.Number(n)
 			}
-			wtyp := wire.Type(tag & 7)
+			wtyp := protowire.Type(tag & 7)
 
-			if wtyp == wire.EndGroupType {
+			if wtyp == protowire.EndGroupType {
 				if st.endGroup == num {
 					goto PopState
 				}
@@ -348,15 +348,15 @@
 				ok := false
 				switch vi.typ {
 				case validationTypeVarint:
-					ok = wtyp == wire.VarintType
+					ok = wtyp == protowire.VarintType
 				case validationTypeFixed32:
-					ok = wtyp == wire.Fixed32Type
+					ok = wtyp == protowire.Fixed32Type
 				case validationTypeFixed64:
-					ok = wtyp == wire.Fixed64Type
+					ok = wtyp == protowire.Fixed64Type
 				case validationTypeBytes, validationTypeUTF8String, validationTypeMessage:
-					ok = wtyp == wire.BytesType
+					ok = wtyp == protowire.BytesType
 				case validationTypeGroup:
-					ok = wtyp == wire.StartGroupType
+					ok = wtyp == protowire.StartGroupType
 				}
 				if ok {
 					st.requiredMask |= vi.requiredBit
@@ -364,7 +364,7 @@
 			}
 
 			switch wtyp {
-			case wire.VarintType:
+			case protowire.VarintType:
 				if len(b) >= 10 {
 					switch {
 					case b[0] < 0x80:
@@ -417,7 +417,7 @@
 					}
 				}
 				continue State
-			case wire.BytesType:
+			case protowire.BytesType:
 				var size uint64
 				if len(b) >= 1 && b[0] < 0x80 {
 					size = uint64(b[0])
@@ -427,7 +427,7 @@
 					b = b[2:]
 				} else {
 					var n int
-					size, n = wire.ConsumeVarint(b)
+					size, n = protowire.ConsumeVarint(b)
 					if n < 0 {
 						return out, ValidationInvalid
 					}
@@ -461,7 +461,7 @@
 				case validationTypeRepeatedVarint:
 					// Packed field.
 					for len(v) > 0 {
-						_, n := wire.ConsumeVarint(v)
+						_, n := protowire.ConsumeVarint(v)
 						if n < 0 {
 							return out, ValidationInvalid
 						}
@@ -482,17 +482,17 @@
 						return out, ValidationInvalid
 					}
 				}
-			case wire.Fixed32Type:
+			case protowire.Fixed32Type:
 				if len(b) < 4 {
 					return out, ValidationInvalid
 				}
 				b = b[4:]
-			case wire.Fixed64Type:
+			case protowire.Fixed64Type:
 				if len(b) < 8 {
 					return out, ValidationInvalid
 				}
 				b = b[8:]
-			case wire.StartGroupType:
+			case protowire.StartGroupType:
 				switch {
 				case vi.typ == validationTypeGroup:
 					if vi.mi == nil {
@@ -530,7 +530,7 @@
 						continue State
 					}
 				default:
-					n := wire.ConsumeFieldValue(num, wtyp, b)
+					n := protowire.ConsumeFieldValue(num, wtyp, b)
 					if n < 0 {
 						return out, ValidationInvalid
 					}
diff --git a/proto/decode.go b/proto/decode.go
index 536491b..1282147 100644
--- a/proto/decode.go
+++ b/proto/decode.go
@@ -5,8 +5,8 @@
 package proto
 
 import (
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/internal/encoding/messageset"
-	"google.golang.org/protobuf/internal/encoding/wire"
 	"google.golang.org/protobuf/internal/errors"
 	"google.golang.org/protobuf/internal/flags"
 	"google.golang.org/protobuf/internal/pragma"
@@ -110,11 +110,11 @@
 	fields := md.Fields()
 	for len(b) > 0 {
 		// Parse the tag (field number and wire type).
-		num, wtyp, tagLen := wire.ConsumeTag(b)
+		num, wtyp, tagLen := protowire.ConsumeTag(b)
 		if tagLen < 0 {
-			return wire.ParseError(tagLen)
+			return protowire.ParseError(tagLen)
 		}
-		if num > wire.MaxValidNumber {
+		if num > protowire.MaxValidNumber {
 			return errors.New("invalid field number")
 		}
 
@@ -153,9 +153,9 @@
 			if err != errUnknown {
 				return err
 			}
-			valLen = wire.ConsumeFieldValue(num, wtyp, b[tagLen:])
+			valLen = protowire.ConsumeFieldValue(num, wtyp, b[tagLen:])
 			if valLen < 0 {
-				return wire.ParseError(valLen)
+				return protowire.ParseError(valLen)
 			}
 			if !o.DiscardUnknown {
 				m.SetUnknown(append(m.GetUnknown(), b[:tagLen+valLen]...))
@@ -166,7 +166,7 @@
 	return nil
 }
 
-func (o UnmarshalOptions) unmarshalSingular(b []byte, wtyp wire.Type, m protoreflect.Message, fd protoreflect.FieldDescriptor) (n int, err error) {
+func (o UnmarshalOptions) unmarshalSingular(b []byte, wtyp protowire.Type, m protoreflect.Message, fd protoreflect.FieldDescriptor) (n int, err error) {
 	v, n, err := o.unmarshalScalar(b, wtyp, fd)
 	if err != nil {
 		return 0, err
@@ -184,13 +184,13 @@
 	return n, nil
 }
 
-func (o UnmarshalOptions) unmarshalMap(b []byte, wtyp wire.Type, mapv protoreflect.Map, fd protoreflect.FieldDescriptor) (n int, err error) {
-	if wtyp != wire.BytesType {
+func (o UnmarshalOptions) unmarshalMap(b []byte, wtyp protowire.Type, mapv protoreflect.Map, fd protoreflect.FieldDescriptor) (n int, err error) {
+	if wtyp != protowire.BytesType {
 		return 0, errUnknown
 	}
-	b, n = wire.ConsumeBytes(b)
+	b, n = protowire.ConsumeBytes(b)
 	if n < 0 {
-		return 0, wire.ParseError(n)
+		return 0, protowire.ParseError(n)
 	}
 	var (
 		keyField = fd.MapKey()
@@ -207,11 +207,11 @@
 	// Map entries are represented as a two-element message with fields
 	// containing the key and value.
 	for len(b) > 0 {
-		num, wtyp, n := wire.ConsumeTag(b)
+		num, wtyp, n := protowire.ConsumeTag(b)
 		if n < 0 {
-			return 0, wire.ParseError(n)
+			return 0, protowire.ParseError(n)
 		}
-		if num > wire.MaxValidNumber {
+		if num > protowire.MaxValidNumber {
 			return 0, errors.New("invalid field number")
 		}
 		b = b[n:]
@@ -240,9 +240,9 @@
 			haveVal = true
 		}
 		if err == errUnknown {
-			n = wire.ConsumeFieldValue(num, wtyp, b)
+			n = protowire.ConsumeFieldValue(num, wtyp, b)
 			if n < 0 {
-				return 0, wire.ParseError(n)
+				return 0, protowire.ParseError(n)
 			}
 		} else if err != nil {
 			return 0, err
diff --git a/proto/decode_gen.go b/proto/decode_gen.go
index b850fb4..d6dc904 100644
--- a/proto/decode_gen.go
+++ b/proto/decode_gen.go
@@ -10,7 +10,7 @@
 	"math"
 	"unicode/utf8"
 
-	"google.golang.org/protobuf/internal/encoding/wire"
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/internal/errors"
 	"google.golang.org/protobuf/internal/strs"
 	"google.golang.org/protobuf/reflect/protoreflect"
@@ -19,171 +19,171 @@
 // unmarshalScalar decodes a value of the given kind.
 //
 // Message values are decoded into a []byte which aliases the input data.
-func (o UnmarshalOptions) unmarshalScalar(b []byte, wtyp wire.Type, fd protoreflect.FieldDescriptor) (val protoreflect.Value, n int, err error) {
+func (o UnmarshalOptions) unmarshalScalar(b []byte, wtyp protowire.Type, fd protoreflect.FieldDescriptor) (val protoreflect.Value, n int, err error) {
 	switch fd.Kind() {
 	case protoreflect.BoolKind:
-		if wtyp != wire.VarintType {
+		if wtyp != protowire.VarintType {
 			return val, 0, errUnknown
 		}
-		v, n := wire.ConsumeVarint(b)
+		v, n := protowire.ConsumeVarint(b)
 		if n < 0 {
-			return val, 0, wire.ParseError(n)
+			return val, 0, protowire.ParseError(n)
 		}
-		return protoreflect.ValueOfBool(wire.DecodeBool(v)), n, nil
+		return protoreflect.ValueOfBool(protowire.DecodeBool(v)), n, nil
 	case protoreflect.EnumKind:
-		if wtyp != wire.VarintType {
+		if wtyp != protowire.VarintType {
 			return val, 0, errUnknown
 		}
-		v, n := wire.ConsumeVarint(b)
+		v, n := protowire.ConsumeVarint(b)
 		if n < 0 {
-			return val, 0, wire.ParseError(n)
+			return val, 0, protowire.ParseError(n)
 		}
 		return protoreflect.ValueOfEnum(protoreflect.EnumNumber(v)), n, nil
 	case protoreflect.Int32Kind:
-		if wtyp != wire.VarintType {
+		if wtyp != protowire.VarintType {
 			return val, 0, errUnknown
 		}
-		v, n := wire.ConsumeVarint(b)
+		v, n := protowire.ConsumeVarint(b)
 		if n < 0 {
-			return val, 0, wire.ParseError(n)
+			return val, 0, protowire.ParseError(n)
 		}
 		return protoreflect.ValueOfInt32(int32(v)), n, nil
 	case protoreflect.Sint32Kind:
-		if wtyp != wire.VarintType {
+		if wtyp != protowire.VarintType {
 			return val, 0, errUnknown
 		}
-		v, n := wire.ConsumeVarint(b)
+		v, n := protowire.ConsumeVarint(b)
 		if n < 0 {
-			return val, 0, wire.ParseError(n)
+			return val, 0, protowire.ParseError(n)
 		}
-		return protoreflect.ValueOfInt32(int32(wire.DecodeZigZag(v & math.MaxUint32))), n, nil
+		return protoreflect.ValueOfInt32(int32(protowire.DecodeZigZag(v & math.MaxUint32))), n, nil
 	case protoreflect.Uint32Kind:
-		if wtyp != wire.VarintType {
+		if wtyp != protowire.VarintType {
 			return val, 0, errUnknown
 		}
-		v, n := wire.ConsumeVarint(b)
+		v, n := protowire.ConsumeVarint(b)
 		if n < 0 {
-			return val, 0, wire.ParseError(n)
+			return val, 0, protowire.ParseError(n)
 		}
 		return protoreflect.ValueOfUint32(uint32(v)), n, nil
 	case protoreflect.Int64Kind:
-		if wtyp != wire.VarintType {
+		if wtyp != protowire.VarintType {
 			return val, 0, errUnknown
 		}
-		v, n := wire.ConsumeVarint(b)
+		v, n := protowire.ConsumeVarint(b)
 		if n < 0 {
-			return val, 0, wire.ParseError(n)
+			return val, 0, protowire.ParseError(n)
 		}
 		return protoreflect.ValueOfInt64(int64(v)), n, nil
 	case protoreflect.Sint64Kind:
-		if wtyp != wire.VarintType {
+		if wtyp != protowire.VarintType {
 			return val, 0, errUnknown
 		}
-		v, n := wire.ConsumeVarint(b)
+		v, n := protowire.ConsumeVarint(b)
 		if n < 0 {
-			return val, 0, wire.ParseError(n)
+			return val, 0, protowire.ParseError(n)
 		}
-		return protoreflect.ValueOfInt64(wire.DecodeZigZag(v)), n, nil
+		return protoreflect.ValueOfInt64(protowire.DecodeZigZag(v)), n, nil
 	case protoreflect.Uint64Kind:
-		if wtyp != wire.VarintType {
+		if wtyp != protowire.VarintType {
 			return val, 0, errUnknown
 		}
-		v, n := wire.ConsumeVarint(b)
+		v, n := protowire.ConsumeVarint(b)
 		if n < 0 {
-			return val, 0, wire.ParseError(n)
+			return val, 0, protowire.ParseError(n)
 		}
 		return protoreflect.ValueOfUint64(v), n, nil
 	case protoreflect.Sfixed32Kind:
-		if wtyp != wire.Fixed32Type {
+		if wtyp != protowire.Fixed32Type {
 			return val, 0, errUnknown
 		}
-		v, n := wire.ConsumeFixed32(b)
+		v, n := protowire.ConsumeFixed32(b)
 		if n < 0 {
-			return val, 0, wire.ParseError(n)
+			return val, 0, protowire.ParseError(n)
 		}
 		return protoreflect.ValueOfInt32(int32(v)), n, nil
 	case protoreflect.Fixed32Kind:
-		if wtyp != wire.Fixed32Type {
+		if wtyp != protowire.Fixed32Type {
 			return val, 0, errUnknown
 		}
-		v, n := wire.ConsumeFixed32(b)
+		v, n := protowire.ConsumeFixed32(b)
 		if n < 0 {
-			return val, 0, wire.ParseError(n)
+			return val, 0, protowire.ParseError(n)
 		}
 		return protoreflect.ValueOfUint32(uint32(v)), n, nil
 	case protoreflect.FloatKind:
-		if wtyp != wire.Fixed32Type {
+		if wtyp != protowire.Fixed32Type {
 			return val, 0, errUnknown
 		}
-		v, n := wire.ConsumeFixed32(b)
+		v, n := protowire.ConsumeFixed32(b)
 		if n < 0 {
-			return val, 0, wire.ParseError(n)
+			return val, 0, protowire.ParseError(n)
 		}
 		return protoreflect.ValueOfFloat32(math.Float32frombits(uint32(v))), n, nil
 	case protoreflect.Sfixed64Kind:
-		if wtyp != wire.Fixed64Type {
+		if wtyp != protowire.Fixed64Type {
 			return val, 0, errUnknown
 		}
-		v, n := wire.ConsumeFixed64(b)
+		v, n := protowire.ConsumeFixed64(b)
 		if n < 0 {
-			return val, 0, wire.ParseError(n)
+			return val, 0, protowire.ParseError(n)
 		}
 		return protoreflect.ValueOfInt64(int64(v)), n, nil
 	case protoreflect.Fixed64Kind:
-		if wtyp != wire.Fixed64Type {
+		if wtyp != protowire.Fixed64Type {
 			return val, 0, errUnknown
 		}
-		v, n := wire.ConsumeFixed64(b)
+		v, n := protowire.ConsumeFixed64(b)
 		if n < 0 {
-			return val, 0, wire.ParseError(n)
+			return val, 0, protowire.ParseError(n)
 		}
 		return protoreflect.ValueOfUint64(v), n, nil
 	case protoreflect.DoubleKind:
-		if wtyp != wire.Fixed64Type {
+		if wtyp != protowire.Fixed64Type {
 			return val, 0, errUnknown
 		}
-		v, n := wire.ConsumeFixed64(b)
+		v, n := protowire.ConsumeFixed64(b)
 		if n < 0 {
-			return val, 0, wire.ParseError(n)
+			return val, 0, protowire.ParseError(n)
 		}
 		return protoreflect.ValueOfFloat64(math.Float64frombits(v)), n, nil
 	case protoreflect.StringKind:
-		if wtyp != wire.BytesType {
+		if wtyp != protowire.BytesType {
 			return val, 0, errUnknown
 		}
-		v, n := wire.ConsumeBytes(b)
+		v, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return val, 0, wire.ParseError(n)
+			return val, 0, protowire.ParseError(n)
 		}
 		if strs.EnforceUTF8(fd) && !utf8.Valid(v) {
 			return protoreflect.Value{}, 0, errors.InvalidUTF8(string(fd.FullName()))
 		}
 		return protoreflect.ValueOfString(string(v)), n, nil
 	case protoreflect.BytesKind:
-		if wtyp != wire.BytesType {
+		if wtyp != protowire.BytesType {
 			return val, 0, errUnknown
 		}
-		v, n := wire.ConsumeBytes(b)
+		v, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return val, 0, wire.ParseError(n)
+			return val, 0, protowire.ParseError(n)
 		}
 		return protoreflect.ValueOfBytes(append(emptyBuf[:], v...)), n, nil
 	case protoreflect.MessageKind:
-		if wtyp != wire.BytesType {
+		if wtyp != protowire.BytesType {
 			return val, 0, errUnknown
 		}
-		v, n := wire.ConsumeBytes(b)
+		v, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return val, 0, wire.ParseError(n)
+			return val, 0, protowire.ParseError(n)
 		}
 		return protoreflect.ValueOfBytes(v), n, nil
 	case protoreflect.GroupKind:
-		if wtyp != wire.StartGroupType {
+		if wtyp != protowire.StartGroupType {
 			return val, 0, errUnknown
 		}
-		v, n := wire.ConsumeGroup(fd.Number(), b)
+		v, n := protowire.ConsumeGroup(fd.Number(), b)
 		if n < 0 {
-			return val, 0, wire.ParseError(n)
+			return val, 0, protowire.ParseError(n)
 		}
 		return protoreflect.ValueOfBytes(v), n, nil
 	default:
@@ -191,365 +191,365 @@
 	}
 }
 
-func (o UnmarshalOptions) unmarshalList(b []byte, wtyp wire.Type, list protoreflect.List, fd protoreflect.FieldDescriptor) (n int, err error) {
+func (o UnmarshalOptions) unmarshalList(b []byte, wtyp protowire.Type, list protoreflect.List, fd protoreflect.FieldDescriptor) (n int, err error) {
 	switch fd.Kind() {
 	case protoreflect.BoolKind:
-		if wtyp == wire.BytesType {
-			buf, n := wire.ConsumeBytes(b)
+		if wtyp == protowire.BytesType {
+			buf, n := protowire.ConsumeBytes(b)
 			if n < 0 {
-				return 0, wire.ParseError(n)
+				return 0, protowire.ParseError(n)
 			}
 			for len(buf) > 0 {
-				v, n := wire.ConsumeVarint(buf)
+				v, n := protowire.ConsumeVarint(buf)
 				if n < 0 {
-					return 0, wire.ParseError(n)
+					return 0, protowire.ParseError(n)
 				}
 				buf = buf[n:]
-				list.Append(protoreflect.ValueOfBool(wire.DecodeBool(v)))
+				list.Append(protoreflect.ValueOfBool(protowire.DecodeBool(v)))
 			}
 			return n, nil
 		}
-		if wtyp != wire.VarintType {
+		if wtyp != protowire.VarintType {
 			return 0, errUnknown
 		}
-		v, n := wire.ConsumeVarint(b)
+		v, n := protowire.ConsumeVarint(b)
 		if n < 0 {
-			return 0, wire.ParseError(n)
+			return 0, protowire.ParseError(n)
 		}
-		list.Append(protoreflect.ValueOfBool(wire.DecodeBool(v)))
+		list.Append(protoreflect.ValueOfBool(protowire.DecodeBool(v)))
 		return n, nil
 	case protoreflect.EnumKind:
-		if wtyp == wire.BytesType {
-			buf, n := wire.ConsumeBytes(b)
+		if wtyp == protowire.BytesType {
+			buf, n := protowire.ConsumeBytes(b)
 			if n < 0 {
-				return 0, wire.ParseError(n)
+				return 0, protowire.ParseError(n)
 			}
 			for len(buf) > 0 {
-				v, n := wire.ConsumeVarint(buf)
+				v, n := protowire.ConsumeVarint(buf)
 				if n < 0 {
-					return 0, wire.ParseError(n)
+					return 0, protowire.ParseError(n)
 				}
 				buf = buf[n:]
 				list.Append(protoreflect.ValueOfEnum(protoreflect.EnumNumber(v)))
 			}
 			return n, nil
 		}
-		if wtyp != wire.VarintType {
+		if wtyp != protowire.VarintType {
 			return 0, errUnknown
 		}
-		v, n := wire.ConsumeVarint(b)
+		v, n := protowire.ConsumeVarint(b)
 		if n < 0 {
-			return 0, wire.ParseError(n)
+			return 0, protowire.ParseError(n)
 		}
 		list.Append(protoreflect.ValueOfEnum(protoreflect.EnumNumber(v)))
 		return n, nil
 	case protoreflect.Int32Kind:
-		if wtyp == wire.BytesType {
-			buf, n := wire.ConsumeBytes(b)
+		if wtyp == protowire.BytesType {
+			buf, n := protowire.ConsumeBytes(b)
 			if n < 0 {
-				return 0, wire.ParseError(n)
+				return 0, protowire.ParseError(n)
 			}
 			for len(buf) > 0 {
-				v, n := wire.ConsumeVarint(buf)
+				v, n := protowire.ConsumeVarint(buf)
 				if n < 0 {
-					return 0, wire.ParseError(n)
+					return 0, protowire.ParseError(n)
 				}
 				buf = buf[n:]
 				list.Append(protoreflect.ValueOfInt32(int32(v)))
 			}
 			return n, nil
 		}
-		if wtyp != wire.VarintType {
+		if wtyp != protowire.VarintType {
 			return 0, errUnknown
 		}
-		v, n := wire.ConsumeVarint(b)
+		v, n := protowire.ConsumeVarint(b)
 		if n < 0 {
-			return 0, wire.ParseError(n)
+			return 0, protowire.ParseError(n)
 		}
 		list.Append(protoreflect.ValueOfInt32(int32(v)))
 		return n, nil
 	case protoreflect.Sint32Kind:
-		if wtyp == wire.BytesType {
-			buf, n := wire.ConsumeBytes(b)
+		if wtyp == protowire.BytesType {
+			buf, n := protowire.ConsumeBytes(b)
 			if n < 0 {
-				return 0, wire.ParseError(n)
+				return 0, protowire.ParseError(n)
 			}
 			for len(buf) > 0 {
-				v, n := wire.ConsumeVarint(buf)
+				v, n := protowire.ConsumeVarint(buf)
 				if n < 0 {
-					return 0, wire.ParseError(n)
+					return 0, protowire.ParseError(n)
 				}
 				buf = buf[n:]
-				list.Append(protoreflect.ValueOfInt32(int32(wire.DecodeZigZag(v & math.MaxUint32))))
+				list.Append(protoreflect.ValueOfInt32(int32(protowire.DecodeZigZag(v & math.MaxUint32))))
 			}
 			return n, nil
 		}
-		if wtyp != wire.VarintType {
+		if wtyp != protowire.VarintType {
 			return 0, errUnknown
 		}
-		v, n := wire.ConsumeVarint(b)
+		v, n := protowire.ConsumeVarint(b)
 		if n < 0 {
-			return 0, wire.ParseError(n)
+			return 0, protowire.ParseError(n)
 		}
-		list.Append(protoreflect.ValueOfInt32(int32(wire.DecodeZigZag(v & math.MaxUint32))))
+		list.Append(protoreflect.ValueOfInt32(int32(protowire.DecodeZigZag(v & math.MaxUint32))))
 		return n, nil
 	case protoreflect.Uint32Kind:
-		if wtyp == wire.BytesType {
-			buf, n := wire.ConsumeBytes(b)
+		if wtyp == protowire.BytesType {
+			buf, n := protowire.ConsumeBytes(b)
 			if n < 0 {
-				return 0, wire.ParseError(n)
+				return 0, protowire.ParseError(n)
 			}
 			for len(buf) > 0 {
-				v, n := wire.ConsumeVarint(buf)
+				v, n := protowire.ConsumeVarint(buf)
 				if n < 0 {
-					return 0, wire.ParseError(n)
+					return 0, protowire.ParseError(n)
 				}
 				buf = buf[n:]
 				list.Append(protoreflect.ValueOfUint32(uint32(v)))
 			}
 			return n, nil
 		}
-		if wtyp != wire.VarintType {
+		if wtyp != protowire.VarintType {
 			return 0, errUnknown
 		}
-		v, n := wire.ConsumeVarint(b)
+		v, n := protowire.ConsumeVarint(b)
 		if n < 0 {
-			return 0, wire.ParseError(n)
+			return 0, protowire.ParseError(n)
 		}
 		list.Append(protoreflect.ValueOfUint32(uint32(v)))
 		return n, nil
 	case protoreflect.Int64Kind:
-		if wtyp == wire.BytesType {
-			buf, n := wire.ConsumeBytes(b)
+		if wtyp == protowire.BytesType {
+			buf, n := protowire.ConsumeBytes(b)
 			if n < 0 {
-				return 0, wire.ParseError(n)
+				return 0, protowire.ParseError(n)
 			}
 			for len(buf) > 0 {
-				v, n := wire.ConsumeVarint(buf)
+				v, n := protowire.ConsumeVarint(buf)
 				if n < 0 {
-					return 0, wire.ParseError(n)
+					return 0, protowire.ParseError(n)
 				}
 				buf = buf[n:]
 				list.Append(protoreflect.ValueOfInt64(int64(v)))
 			}
 			return n, nil
 		}
-		if wtyp != wire.VarintType {
+		if wtyp != protowire.VarintType {
 			return 0, errUnknown
 		}
-		v, n := wire.ConsumeVarint(b)
+		v, n := protowire.ConsumeVarint(b)
 		if n < 0 {
-			return 0, wire.ParseError(n)
+			return 0, protowire.ParseError(n)
 		}
 		list.Append(protoreflect.ValueOfInt64(int64(v)))
 		return n, nil
 	case protoreflect.Sint64Kind:
-		if wtyp == wire.BytesType {
-			buf, n := wire.ConsumeBytes(b)
+		if wtyp == protowire.BytesType {
+			buf, n := protowire.ConsumeBytes(b)
 			if n < 0 {
-				return 0, wire.ParseError(n)
+				return 0, protowire.ParseError(n)
 			}
 			for len(buf) > 0 {
-				v, n := wire.ConsumeVarint(buf)
+				v, n := protowire.ConsumeVarint(buf)
 				if n < 0 {
-					return 0, wire.ParseError(n)
+					return 0, protowire.ParseError(n)
 				}
 				buf = buf[n:]
-				list.Append(protoreflect.ValueOfInt64(wire.DecodeZigZag(v)))
+				list.Append(protoreflect.ValueOfInt64(protowire.DecodeZigZag(v)))
 			}
 			return n, nil
 		}
-		if wtyp != wire.VarintType {
+		if wtyp != protowire.VarintType {
 			return 0, errUnknown
 		}
-		v, n := wire.ConsumeVarint(b)
+		v, n := protowire.ConsumeVarint(b)
 		if n < 0 {
-			return 0, wire.ParseError(n)
+			return 0, protowire.ParseError(n)
 		}
-		list.Append(protoreflect.ValueOfInt64(wire.DecodeZigZag(v)))
+		list.Append(protoreflect.ValueOfInt64(protowire.DecodeZigZag(v)))
 		return n, nil
 	case protoreflect.Uint64Kind:
-		if wtyp == wire.BytesType {
-			buf, n := wire.ConsumeBytes(b)
+		if wtyp == protowire.BytesType {
+			buf, n := protowire.ConsumeBytes(b)
 			if n < 0 {
-				return 0, wire.ParseError(n)
+				return 0, protowire.ParseError(n)
 			}
 			for len(buf) > 0 {
-				v, n := wire.ConsumeVarint(buf)
+				v, n := protowire.ConsumeVarint(buf)
 				if n < 0 {
-					return 0, wire.ParseError(n)
+					return 0, protowire.ParseError(n)
 				}
 				buf = buf[n:]
 				list.Append(protoreflect.ValueOfUint64(v))
 			}
 			return n, nil
 		}
-		if wtyp != wire.VarintType {
+		if wtyp != protowire.VarintType {
 			return 0, errUnknown
 		}
-		v, n := wire.ConsumeVarint(b)
+		v, n := protowire.ConsumeVarint(b)
 		if n < 0 {
-			return 0, wire.ParseError(n)
+			return 0, protowire.ParseError(n)
 		}
 		list.Append(protoreflect.ValueOfUint64(v))
 		return n, nil
 	case protoreflect.Sfixed32Kind:
-		if wtyp == wire.BytesType {
-			buf, n := wire.ConsumeBytes(b)
+		if wtyp == protowire.BytesType {
+			buf, n := protowire.ConsumeBytes(b)
 			if n < 0 {
-				return 0, wire.ParseError(n)
+				return 0, protowire.ParseError(n)
 			}
 			for len(buf) > 0 {
-				v, n := wire.ConsumeFixed32(buf)
+				v, n := protowire.ConsumeFixed32(buf)
 				if n < 0 {
-					return 0, wire.ParseError(n)
+					return 0, protowire.ParseError(n)
 				}
 				buf = buf[n:]
 				list.Append(protoreflect.ValueOfInt32(int32(v)))
 			}
 			return n, nil
 		}
-		if wtyp != wire.Fixed32Type {
+		if wtyp != protowire.Fixed32Type {
 			return 0, errUnknown
 		}
-		v, n := wire.ConsumeFixed32(b)
+		v, n := protowire.ConsumeFixed32(b)
 		if n < 0 {
-			return 0, wire.ParseError(n)
+			return 0, protowire.ParseError(n)
 		}
 		list.Append(protoreflect.ValueOfInt32(int32(v)))
 		return n, nil
 	case protoreflect.Fixed32Kind:
-		if wtyp == wire.BytesType {
-			buf, n := wire.ConsumeBytes(b)
+		if wtyp == protowire.BytesType {
+			buf, n := protowire.ConsumeBytes(b)
 			if n < 0 {
-				return 0, wire.ParseError(n)
+				return 0, protowire.ParseError(n)
 			}
 			for len(buf) > 0 {
-				v, n := wire.ConsumeFixed32(buf)
+				v, n := protowire.ConsumeFixed32(buf)
 				if n < 0 {
-					return 0, wire.ParseError(n)
+					return 0, protowire.ParseError(n)
 				}
 				buf = buf[n:]
 				list.Append(protoreflect.ValueOfUint32(uint32(v)))
 			}
 			return n, nil
 		}
-		if wtyp != wire.Fixed32Type {
+		if wtyp != protowire.Fixed32Type {
 			return 0, errUnknown
 		}
-		v, n := wire.ConsumeFixed32(b)
+		v, n := protowire.ConsumeFixed32(b)
 		if n < 0 {
-			return 0, wire.ParseError(n)
+			return 0, protowire.ParseError(n)
 		}
 		list.Append(protoreflect.ValueOfUint32(uint32(v)))
 		return n, nil
 	case protoreflect.FloatKind:
-		if wtyp == wire.BytesType {
-			buf, n := wire.ConsumeBytes(b)
+		if wtyp == protowire.BytesType {
+			buf, n := protowire.ConsumeBytes(b)
 			if n < 0 {
-				return 0, wire.ParseError(n)
+				return 0, protowire.ParseError(n)
 			}
 			for len(buf) > 0 {
-				v, n := wire.ConsumeFixed32(buf)
+				v, n := protowire.ConsumeFixed32(buf)
 				if n < 0 {
-					return 0, wire.ParseError(n)
+					return 0, protowire.ParseError(n)
 				}
 				buf = buf[n:]
 				list.Append(protoreflect.ValueOfFloat32(math.Float32frombits(uint32(v))))
 			}
 			return n, nil
 		}
-		if wtyp != wire.Fixed32Type {
+		if wtyp != protowire.Fixed32Type {
 			return 0, errUnknown
 		}
-		v, n := wire.ConsumeFixed32(b)
+		v, n := protowire.ConsumeFixed32(b)
 		if n < 0 {
-			return 0, wire.ParseError(n)
+			return 0, protowire.ParseError(n)
 		}
 		list.Append(protoreflect.ValueOfFloat32(math.Float32frombits(uint32(v))))
 		return n, nil
 	case protoreflect.Sfixed64Kind:
-		if wtyp == wire.BytesType {
-			buf, n := wire.ConsumeBytes(b)
+		if wtyp == protowire.BytesType {
+			buf, n := protowire.ConsumeBytes(b)
 			if n < 0 {
-				return 0, wire.ParseError(n)
+				return 0, protowire.ParseError(n)
 			}
 			for len(buf) > 0 {
-				v, n := wire.ConsumeFixed64(buf)
+				v, n := protowire.ConsumeFixed64(buf)
 				if n < 0 {
-					return 0, wire.ParseError(n)
+					return 0, protowire.ParseError(n)
 				}
 				buf = buf[n:]
 				list.Append(protoreflect.ValueOfInt64(int64(v)))
 			}
 			return n, nil
 		}
-		if wtyp != wire.Fixed64Type {
+		if wtyp != protowire.Fixed64Type {
 			return 0, errUnknown
 		}
-		v, n := wire.ConsumeFixed64(b)
+		v, n := protowire.ConsumeFixed64(b)
 		if n < 0 {
-			return 0, wire.ParseError(n)
+			return 0, protowire.ParseError(n)
 		}
 		list.Append(protoreflect.ValueOfInt64(int64(v)))
 		return n, nil
 	case protoreflect.Fixed64Kind:
-		if wtyp == wire.BytesType {
-			buf, n := wire.ConsumeBytes(b)
+		if wtyp == protowire.BytesType {
+			buf, n := protowire.ConsumeBytes(b)
 			if n < 0 {
-				return 0, wire.ParseError(n)
+				return 0, protowire.ParseError(n)
 			}
 			for len(buf) > 0 {
-				v, n := wire.ConsumeFixed64(buf)
+				v, n := protowire.ConsumeFixed64(buf)
 				if n < 0 {
-					return 0, wire.ParseError(n)
+					return 0, protowire.ParseError(n)
 				}
 				buf = buf[n:]
 				list.Append(protoreflect.ValueOfUint64(v))
 			}
 			return n, nil
 		}
-		if wtyp != wire.Fixed64Type {
+		if wtyp != protowire.Fixed64Type {
 			return 0, errUnknown
 		}
-		v, n := wire.ConsumeFixed64(b)
+		v, n := protowire.ConsumeFixed64(b)
 		if n < 0 {
-			return 0, wire.ParseError(n)
+			return 0, protowire.ParseError(n)
 		}
 		list.Append(protoreflect.ValueOfUint64(v))
 		return n, nil
 	case protoreflect.DoubleKind:
-		if wtyp == wire.BytesType {
-			buf, n := wire.ConsumeBytes(b)
+		if wtyp == protowire.BytesType {
+			buf, n := protowire.ConsumeBytes(b)
 			if n < 0 {
-				return 0, wire.ParseError(n)
+				return 0, protowire.ParseError(n)
 			}
 			for len(buf) > 0 {
-				v, n := wire.ConsumeFixed64(buf)
+				v, n := protowire.ConsumeFixed64(buf)
 				if n < 0 {
-					return 0, wire.ParseError(n)
+					return 0, protowire.ParseError(n)
 				}
 				buf = buf[n:]
 				list.Append(protoreflect.ValueOfFloat64(math.Float64frombits(v)))
 			}
 			return n, nil
 		}
-		if wtyp != wire.Fixed64Type {
+		if wtyp != protowire.Fixed64Type {
 			return 0, errUnknown
 		}
-		v, n := wire.ConsumeFixed64(b)
+		v, n := protowire.ConsumeFixed64(b)
 		if n < 0 {
-			return 0, wire.ParseError(n)
+			return 0, protowire.ParseError(n)
 		}
 		list.Append(protoreflect.ValueOfFloat64(math.Float64frombits(v)))
 		return n, nil
 	case protoreflect.StringKind:
-		if wtyp != wire.BytesType {
+		if wtyp != protowire.BytesType {
 			return 0, errUnknown
 		}
-		v, n := wire.ConsumeBytes(b)
+		v, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return 0, wire.ParseError(n)
+			return 0, protowire.ParseError(n)
 		}
 		if strs.EnforceUTF8(fd) && !utf8.Valid(v) {
 			return 0, errors.InvalidUTF8(string(fd.FullName()))
@@ -557,22 +557,22 @@
 		list.Append(protoreflect.ValueOfString(string(v)))
 		return n, nil
 	case protoreflect.BytesKind:
-		if wtyp != wire.BytesType {
+		if wtyp != protowire.BytesType {
 			return 0, errUnknown
 		}
-		v, n := wire.ConsumeBytes(b)
+		v, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return 0, wire.ParseError(n)
+			return 0, protowire.ParseError(n)
 		}
 		list.Append(protoreflect.ValueOfBytes(append(emptyBuf[:], v...)))
 		return n, nil
 	case protoreflect.MessageKind:
-		if wtyp != wire.BytesType {
+		if wtyp != protowire.BytesType {
 			return 0, errUnknown
 		}
-		v, n := wire.ConsumeBytes(b)
+		v, n := protowire.ConsumeBytes(b)
 		if n < 0 {
-			return 0, wire.ParseError(n)
+			return 0, protowire.ParseError(n)
 		}
 		m := list.NewElement()
 		if err := o.unmarshalMessage(v, m.Message()); err != nil {
@@ -581,12 +581,12 @@
 		list.Append(m)
 		return n, nil
 	case protoreflect.GroupKind:
-		if wtyp != wire.StartGroupType {
+		if wtyp != protowire.StartGroupType {
 			return 0, errUnknown
 		}
-		v, n := wire.ConsumeGroup(fd.Number(), b)
+		v, n := protowire.ConsumeGroup(fd.Number(), b)
 		if n < 0 {
-			return 0, wire.ParseError(n)
+			return 0, protowire.ParseError(n)
 		}
 		m := list.NewElement()
 		if err := o.unmarshalMessage(v, m.Message()); err != nil {
diff --git a/proto/encode.go b/proto/encode.go
index 999aa7b..fa738a1 100644
--- a/proto/encode.go
+++ b/proto/encode.go
@@ -7,8 +7,8 @@
 import (
 	"sort"
 
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/internal/encoding/messageset"
-	"google.golang.org/protobuf/internal/encoding/wire"
 	"google.golang.org/protobuf/internal/fieldsort"
 	"google.golang.org/protobuf/internal/mapsort"
 	"google.golang.org/protobuf/internal/pragma"
@@ -219,14 +219,14 @@
 	case fd.IsMap():
 		return o.marshalMap(b, fd, value.Map())
 	default:
-		b = wire.AppendTag(b, fd.Number(), wireTypes[fd.Kind()])
+		b = protowire.AppendTag(b, fd.Number(), wireTypes[fd.Kind()])
 		return o.marshalSingular(b, fd, value)
 	}
 }
 
 func (o MarshalOptions) marshalList(b []byte, fd protoreflect.FieldDescriptor, list protoreflect.List) ([]byte, error) {
 	if fd.IsPacked() && list.Len() > 0 {
-		b = wire.AppendTag(b, fd.Number(), wire.BytesType)
+		b = protowire.AppendTag(b, fd.Number(), protowire.BytesType)
 		b, pos := appendSpeculativeLength(b)
 		for i, llen := 0, list.Len(); i < llen; i++ {
 			var err error
@@ -242,7 +242,7 @@
 	kind := fd.Kind()
 	for i, llen := 0, list.Len(); i < llen; i++ {
 		var err error
-		b = wire.AppendTag(b, fd.Number(), wireTypes[kind])
+		b = protowire.AppendTag(b, fd.Number(), wireTypes[kind])
 		b, err = o.marshalSingular(b, fd, list.Get(i))
 		if err != nil {
 			return b, err
@@ -256,7 +256,7 @@
 	valf := fd.MapValue()
 	var err error
 	o.rangeMap(mapv, keyf.Kind(), func(key protoreflect.MapKey, value protoreflect.Value) bool {
-		b = wire.AppendTag(b, fd.Number(), wire.BytesType)
+		b = protowire.AppendTag(b, fd.Number(), protowire.BytesType)
 		var pos int
 		b, pos = appendSpeculativeLength(b)
 
@@ -295,7 +295,7 @@
 
 func finishSpeculativeLength(b []byte, pos int) []byte {
 	mlen := len(b) - pos - speculativeLength
-	msiz := wire.SizeVarint(uint64(mlen))
+	msiz := protowire.SizeVarint(uint64(mlen))
 	if msiz != speculativeLength {
 		for i := 0; i < msiz-speculativeLength; i++ {
 			b = append(b, 0)
@@ -303,6 +303,6 @@
 		copy(b[pos+msiz:], b[pos+speculativeLength:])
 		b = b[:pos+msiz+mlen]
 	}
-	wire.AppendVarint(b[:pos], uint64(mlen))
+	protowire.AppendVarint(b[:pos], uint64(mlen))
 	return b
 }
diff --git a/proto/encode_gen.go b/proto/encode_gen.go
index 1b54088..185dacf 100644
--- a/proto/encode_gen.go
+++ b/proto/encode_gen.go
@@ -10,70 +10,70 @@
 	"math"
 	"unicode/utf8"
 
-	"google.golang.org/protobuf/internal/encoding/wire"
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/internal/errors"
 	"google.golang.org/protobuf/internal/strs"
 	"google.golang.org/protobuf/reflect/protoreflect"
 )
 
-var wireTypes = map[protoreflect.Kind]wire.Type{
-	protoreflect.BoolKind:     wire.VarintType,
-	protoreflect.EnumKind:     wire.VarintType,
-	protoreflect.Int32Kind:    wire.VarintType,
-	protoreflect.Sint32Kind:   wire.VarintType,
-	protoreflect.Uint32Kind:   wire.VarintType,
-	protoreflect.Int64Kind:    wire.VarintType,
-	protoreflect.Sint64Kind:   wire.VarintType,
-	protoreflect.Uint64Kind:   wire.VarintType,
-	protoreflect.Sfixed32Kind: wire.Fixed32Type,
-	protoreflect.Fixed32Kind:  wire.Fixed32Type,
-	protoreflect.FloatKind:    wire.Fixed32Type,
-	protoreflect.Sfixed64Kind: wire.Fixed64Type,
-	protoreflect.Fixed64Kind:  wire.Fixed64Type,
-	protoreflect.DoubleKind:   wire.Fixed64Type,
-	protoreflect.StringKind:   wire.BytesType,
-	protoreflect.BytesKind:    wire.BytesType,
-	protoreflect.MessageKind:  wire.BytesType,
-	protoreflect.GroupKind:    wire.StartGroupType,
+var wireTypes = map[protoreflect.Kind]protowire.Type{
+	protoreflect.BoolKind:     protowire.VarintType,
+	protoreflect.EnumKind:     protowire.VarintType,
+	protoreflect.Int32Kind:    protowire.VarintType,
+	protoreflect.Sint32Kind:   protowire.VarintType,
+	protoreflect.Uint32Kind:   protowire.VarintType,
+	protoreflect.Int64Kind:    protowire.VarintType,
+	protoreflect.Sint64Kind:   protowire.VarintType,
+	protoreflect.Uint64Kind:   protowire.VarintType,
+	protoreflect.Sfixed32Kind: protowire.Fixed32Type,
+	protoreflect.Fixed32Kind:  protowire.Fixed32Type,
+	protoreflect.FloatKind:    protowire.Fixed32Type,
+	protoreflect.Sfixed64Kind: protowire.Fixed64Type,
+	protoreflect.Fixed64Kind:  protowire.Fixed64Type,
+	protoreflect.DoubleKind:   protowire.Fixed64Type,
+	protoreflect.StringKind:   protowire.BytesType,
+	protoreflect.BytesKind:    protowire.BytesType,
+	protoreflect.MessageKind:  protowire.BytesType,
+	protoreflect.GroupKind:    protowire.StartGroupType,
 }
 
 func (o MarshalOptions) marshalSingular(b []byte, fd protoreflect.FieldDescriptor, v protoreflect.Value) ([]byte, error) {
 	switch fd.Kind() {
 	case protoreflect.BoolKind:
-		b = wire.AppendVarint(b, wire.EncodeBool(v.Bool()))
+		b = protowire.AppendVarint(b, protowire.EncodeBool(v.Bool()))
 	case protoreflect.EnumKind:
-		b = wire.AppendVarint(b, uint64(v.Enum()))
+		b = protowire.AppendVarint(b, uint64(v.Enum()))
 	case protoreflect.Int32Kind:
-		b = wire.AppendVarint(b, uint64(int32(v.Int())))
+		b = protowire.AppendVarint(b, uint64(int32(v.Int())))
 	case protoreflect.Sint32Kind:
-		b = wire.AppendVarint(b, wire.EncodeZigZag(int64(int32(v.Int()))))
+		b = protowire.AppendVarint(b, protowire.EncodeZigZag(int64(int32(v.Int()))))
 	case protoreflect.Uint32Kind:
-		b = wire.AppendVarint(b, uint64(uint32(v.Uint())))
+		b = protowire.AppendVarint(b, uint64(uint32(v.Uint())))
 	case protoreflect.Int64Kind:
-		b = wire.AppendVarint(b, uint64(v.Int()))
+		b = protowire.AppendVarint(b, uint64(v.Int()))
 	case protoreflect.Sint64Kind:
-		b = wire.AppendVarint(b, wire.EncodeZigZag(v.Int()))
+		b = protowire.AppendVarint(b, protowire.EncodeZigZag(v.Int()))
 	case protoreflect.Uint64Kind:
-		b = wire.AppendVarint(b, v.Uint())
+		b = protowire.AppendVarint(b, v.Uint())
 	case protoreflect.Sfixed32Kind:
-		b = wire.AppendFixed32(b, uint32(v.Int()))
+		b = protowire.AppendFixed32(b, uint32(v.Int()))
 	case protoreflect.Fixed32Kind:
-		b = wire.AppendFixed32(b, uint32(v.Uint()))
+		b = protowire.AppendFixed32(b, uint32(v.Uint()))
 	case protoreflect.FloatKind:
-		b = wire.AppendFixed32(b, math.Float32bits(float32(v.Float())))
+		b = protowire.AppendFixed32(b, math.Float32bits(float32(v.Float())))
 	case protoreflect.Sfixed64Kind:
-		b = wire.AppendFixed64(b, uint64(v.Int()))
+		b = protowire.AppendFixed64(b, uint64(v.Int()))
 	case protoreflect.Fixed64Kind:
-		b = wire.AppendFixed64(b, v.Uint())
+		b = protowire.AppendFixed64(b, v.Uint())
 	case protoreflect.DoubleKind:
-		b = wire.AppendFixed64(b, math.Float64bits(v.Float()))
+		b = protowire.AppendFixed64(b, math.Float64bits(v.Float()))
 	case protoreflect.StringKind:
 		if strs.EnforceUTF8(fd) && !utf8.ValidString(v.String()) {
 			return b, errors.InvalidUTF8(string(fd.FullName()))
 		}
-		b = wire.AppendString(b, v.String())
+		b = protowire.AppendString(b, v.String())
 	case protoreflect.BytesKind:
-		b = wire.AppendBytes(b, v.Bytes())
+		b = protowire.AppendBytes(b, v.Bytes())
 	case protoreflect.MessageKind:
 		var pos int
 		var err error
@@ -89,7 +89,7 @@
 		if err != nil {
 			return b, err
 		}
-		b = wire.AppendVarint(b, wire.EncodeTag(fd.Number(), wire.EndGroupType))
+		b = protowire.AppendVarint(b, protowire.EncodeTag(fd.Number(), protowire.EndGroupType))
 	default:
 		return b, errors.New("invalid kind %v", fd.Kind())
 	}
diff --git a/proto/encode_test.go b/proto/encode_test.go
index 80e8f5d..d8aabd9 100644
--- a/proto/encode_test.go
+++ b/proto/encode_test.go
@@ -14,7 +14,7 @@
 	"github.com/google/go-cmp/cmp"
 
 	"google.golang.org/protobuf/encoding/prototext"
-	"google.golang.org/protobuf/internal/encoding/wire"
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/proto"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
 
@@ -212,9 +212,9 @@
 	}
 	var got []pref.FieldNumber
 	for len(b) > 0 {
-		num, _, n := wire.ConsumeField(b)
+		num, _, n := protowire.ConsumeField(b)
 		if n < 0 {
-			t.Fatal(wire.ParseError(n))
+			t.Fatal(protowire.ParseError(n))
 		}
 		b = b[n:]
 		got = append(got, num)
diff --git a/proto/equal.go b/proto/equal.go
index d314232..10902bd 100644
--- a/proto/equal.go
+++ b/proto/equal.go
@@ -9,7 +9,7 @@
 	"math"
 	"reflect"
 
-	"google.golang.org/protobuf/internal/encoding/wire"
+	"google.golang.org/protobuf/encoding/protowire"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
 )
 
@@ -141,12 +141,12 @@
 	mx := make(map[pref.FieldNumber]pref.RawFields)
 	my := make(map[pref.FieldNumber]pref.RawFields)
 	for len(x) > 0 {
-		fnum, _, n := wire.ConsumeField(x)
+		fnum, _, n := protowire.ConsumeField(x)
 		mx[fnum] = append(mx[fnum], x[:n]...)
 		x = x[n:]
 	}
 	for len(y) > 0 {
-		fnum, _, n := wire.ConsumeField(y)
+		fnum, _, n := protowire.ConsumeField(y)
 		my[fnum] = append(my[fnum], y[:n]...)
 		y = y[n:]
 	}
diff --git a/proto/messageset.go b/proto/messageset.go
index 6d0a0c2..b6b3de5 100644
--- a/proto/messageset.go
+++ b/proto/messageset.go
@@ -5,8 +5,8 @@
 package proto
 
 import (
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/internal/encoding/messageset"
-	"google.golang.org/protobuf/internal/encoding/wire"
 	"google.golang.org/protobuf/internal/errors"
 	"google.golang.org/protobuf/internal/flags"
 	"google.golang.org/protobuf/reflect/protoreflect"
@@ -16,8 +16,8 @@
 func sizeMessageSet(m protoreflect.Message) (size int) {
 	m.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool {
 		size += messageset.SizeField(fd.Number())
-		size += wire.SizeTag(messageset.FieldMessage)
-		size += wire.SizeBytes(sizeMessage(v.Message()))
+		size += protowire.SizeTag(messageset.FieldMessage)
+		size += protowire.SizeBytes(sizeMessage(v.Message()))
 		return true
 	})
 	size += messageset.SizeUnknown(m.GetUnknown())
@@ -41,8 +41,8 @@
 
 func marshalMessageSetField(b []byte, fd protoreflect.FieldDescriptor, value protoreflect.Value, o MarshalOptions) ([]byte, error) {
 	b = messageset.AppendFieldStart(b, fd.Number())
-	b = wire.AppendTag(b, messageset.FieldMessage, wire.BytesType)
-	b = wire.AppendVarint(b, uint64(o.Size(value.Message().Interface())))
+	b = protowire.AppendTag(b, messageset.FieldMessage, protowire.BytesType)
+	b = protowire.AppendVarint(b, uint64(o.Size(value.Message().Interface())))
 	b, err := o.marshalMessage(b, value.Message())
 	if err != nil {
 		return b, err
@@ -55,12 +55,12 @@
 	if !flags.ProtoLegacy {
 		return errors.New("no support for message_set_wire_format")
 	}
-	return messageset.Unmarshal(b, false, func(num wire.Number, v []byte) error {
+	return messageset.Unmarshal(b, false, func(num protowire.Number, v []byte) error {
 		err := unmarshalMessageSetField(m, num, v, o)
 		if err == errUnknown {
 			unknown := m.GetUnknown()
-			unknown = wire.AppendTag(unknown, num, wire.BytesType)
-			unknown = wire.AppendBytes(unknown, v)
+			unknown = protowire.AppendTag(unknown, num, protowire.BytesType)
+			unknown = protowire.AppendBytes(unknown, v)
 			m.SetUnknown(unknown)
 			return nil
 		}
@@ -68,7 +68,7 @@
 	})
 }
 
-func unmarshalMessageSetField(m protoreflect.Message, num wire.Number, v []byte, o UnmarshalOptions) error {
+func unmarshalMessageSetField(m protoreflect.Message, num protowire.Number, v []byte, o UnmarshalOptions) error {
 	md := m.Descriptor()
 	if !md.ExtensionRanges().Has(num) {
 		return errUnknown
diff --git a/proto/messageset_test.go b/proto/messageset_test.go
index 1eedcc9..1418f4a 100644
--- a/proto/messageset_test.go
+++ b/proto/messageset_test.go
@@ -5,8 +5,8 @@
 package proto_test
 
 import (
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/internal/encoding/pack"
-	"google.golang.org/protobuf/internal/encoding/wire"
 	"google.golang.org/protobuf/internal/flags"
 	"google.golang.org/protobuf/proto"
 
@@ -192,7 +192,7 @@
 		wire: pack.Message{
 			pack.Tag{1, pack.BytesType}, pack.LengthPrefix(pack.Message{
 				pack.Tag{1, pack.StartGroupType},
-				pack.Tag{2, pack.VarintType}, pack.Varint(wire.MaxValidNumber + 1),
+				pack.Tag{2, pack.VarintType}, pack.Varint(protowire.MaxValidNumber + 1),
 				pack.Tag{3, pack.BytesType}, pack.LengthPrefix(pack.Message{}),
 				pack.Tag{1, pack.EndGroupType},
 			}),
@@ -204,7 +204,7 @@
 			m := &messagesetpb.MessageSetContainer{MessageSet: &messagesetpb.MessageSet{}}
 			m.MessageSet.ProtoReflect().SetUnknown(
 				pack.Message{
-					pack.Tag{wire.MaxValidNumber + 2, pack.BytesType}, pack.LengthPrefix{},
+					pack.Tag{protowire.MaxValidNumber + 2, pack.BytesType}, pack.LengthPrefix{},
 				}.Marshal(),
 			)
 			return m
@@ -212,7 +212,7 @@
 		wire: pack.Message{
 			pack.Tag{1, pack.BytesType}, pack.LengthPrefix(pack.Message{
 				pack.Tag{1, pack.StartGroupType},
-				pack.Tag{2, pack.VarintType}, pack.Varint(wire.MaxValidNumber + 2),
+				pack.Tag{2, pack.VarintType}, pack.Varint(protowire.MaxValidNumber + 2),
 				pack.Tag{3, pack.BytesType}, pack.LengthPrefix(pack.Message{}),
 				pack.Tag{1, pack.EndGroupType},
 			}),
diff --git a/proto/size.go b/proto/size.go
index 32620a9..a4e72bd 100644
--- a/proto/size.go
+++ b/proto/size.go
@@ -5,8 +5,8 @@
 package proto
 
 import (
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/internal/encoding/messageset"
-	"google.golang.org/protobuf/internal/encoding/wire"
 	"google.golang.org/protobuf/reflect/protoreflect"
 	"google.golang.org/protobuf/runtime/protoiface"
 )
@@ -60,29 +60,29 @@
 	case fd.IsMap():
 		return sizeMap(num, fd, value.Map())
 	default:
-		return wire.SizeTag(num) + sizeSingular(num, fd.Kind(), value)
+		return protowire.SizeTag(num) + sizeSingular(num, fd.Kind(), value)
 	}
 }
 
-func sizeList(num wire.Number, fd protoreflect.FieldDescriptor, list protoreflect.List) (size int) {
+func sizeList(num protowire.Number, fd protoreflect.FieldDescriptor, list protoreflect.List) (size int) {
 	if fd.IsPacked() && list.Len() > 0 {
 		content := 0
 		for i, llen := 0, list.Len(); i < llen; i++ {
 			content += sizeSingular(num, fd.Kind(), list.Get(i))
 		}
-		return wire.SizeTag(num) + wire.SizeBytes(content)
+		return protowire.SizeTag(num) + protowire.SizeBytes(content)
 	}
 
 	for i, llen := 0, list.Len(); i < llen; i++ {
-		size += wire.SizeTag(num) + sizeSingular(num, fd.Kind(), list.Get(i))
+		size += protowire.SizeTag(num) + sizeSingular(num, fd.Kind(), list.Get(i))
 	}
 	return size
 }
 
-func sizeMap(num wire.Number, fd protoreflect.FieldDescriptor, mapv protoreflect.Map) (size int) {
+func sizeMap(num protowire.Number, fd protoreflect.FieldDescriptor, mapv protoreflect.Map) (size int) {
 	mapv.Range(func(key protoreflect.MapKey, value protoreflect.Value) bool {
-		size += wire.SizeTag(num)
-		size += wire.SizeBytes(sizeField(fd.MapKey(), key.Value()) + sizeField(fd.MapValue(), value))
+		size += protowire.SizeTag(num)
+		size += protowire.SizeBytes(sizeField(fd.MapKey(), key.Value()) + sizeField(fd.MapValue(), value))
 		return true
 	})
 	return size
diff --git a/proto/size_gen.go b/proto/size_gen.go
index 576e2c6..1118460 100644
--- a/proto/size_gen.go
+++ b/proto/size_gen.go
@@ -7,48 +7,48 @@
 package proto
 
 import (
-	"google.golang.org/protobuf/internal/encoding/wire"
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/reflect/protoreflect"
 )
 
-func sizeSingular(num wire.Number, kind protoreflect.Kind, v protoreflect.Value) int {
+func sizeSingular(num protowire.Number, kind protoreflect.Kind, v protoreflect.Value) int {
 	switch kind {
 	case protoreflect.BoolKind:
-		return wire.SizeVarint(wire.EncodeBool(v.Bool()))
+		return protowire.SizeVarint(protowire.EncodeBool(v.Bool()))
 	case protoreflect.EnumKind:
-		return wire.SizeVarint(uint64(v.Enum()))
+		return protowire.SizeVarint(uint64(v.Enum()))
 	case protoreflect.Int32Kind:
-		return wire.SizeVarint(uint64(int32(v.Int())))
+		return protowire.SizeVarint(uint64(int32(v.Int())))
 	case protoreflect.Sint32Kind:
-		return wire.SizeVarint(wire.EncodeZigZag(int64(int32(v.Int()))))
+		return protowire.SizeVarint(protowire.EncodeZigZag(int64(int32(v.Int()))))
 	case protoreflect.Uint32Kind:
-		return wire.SizeVarint(uint64(uint32(v.Uint())))
+		return protowire.SizeVarint(uint64(uint32(v.Uint())))
 	case protoreflect.Int64Kind:
-		return wire.SizeVarint(uint64(v.Int()))
+		return protowire.SizeVarint(uint64(v.Int()))
 	case protoreflect.Sint64Kind:
-		return wire.SizeVarint(wire.EncodeZigZag(v.Int()))
+		return protowire.SizeVarint(protowire.EncodeZigZag(v.Int()))
 	case protoreflect.Uint64Kind:
-		return wire.SizeVarint(v.Uint())
+		return protowire.SizeVarint(v.Uint())
 	case protoreflect.Sfixed32Kind:
-		return wire.SizeFixed32()
+		return protowire.SizeFixed32()
 	case protoreflect.Fixed32Kind:
-		return wire.SizeFixed32()
+		return protowire.SizeFixed32()
 	case protoreflect.FloatKind:
-		return wire.SizeFixed32()
+		return protowire.SizeFixed32()
 	case protoreflect.Sfixed64Kind:
-		return wire.SizeFixed64()
+		return protowire.SizeFixed64()
 	case protoreflect.Fixed64Kind:
-		return wire.SizeFixed64()
+		return protowire.SizeFixed64()
 	case protoreflect.DoubleKind:
-		return wire.SizeFixed64()
+		return protowire.SizeFixed64()
 	case protoreflect.StringKind:
-		return wire.SizeBytes(len(v.String()))
+		return protowire.SizeBytes(len(v.String()))
 	case protoreflect.BytesKind:
-		return wire.SizeBytes(len(v.Bytes()))
+		return protowire.SizeBytes(len(v.Bytes()))
 	case protoreflect.MessageKind:
-		return wire.SizeBytes(sizeMessage(v.Message()))
+		return protowire.SizeBytes(sizeMessage(v.Message()))
 	case protoreflect.GroupKind:
-		return wire.SizeGroup(num, sizeMessage(v.Message()))
+		return protowire.SizeGroup(num, sizeMessage(v.Message()))
 	default:
 		return 0
 	}
diff --git a/proto/testmessages_test.go b/proto/testmessages_test.go
index b0f568f..680faf6 100644
--- a/proto/testmessages_test.go
+++ b/proto/testmessages_test.go
@@ -5,8 +5,8 @@
 package proto_test
 
 import (
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/internal/encoding/pack"
-	"google.golang.org/protobuf/internal/encoding/wire"
 	"google.golang.org/protobuf/internal/impl"
 	"google.golang.org/protobuf/internal/protobuild"
 	"google.golang.org/protobuf/proto"
@@ -1674,7 +1674,7 @@
 			(*testpb.TestAllExtensions)(nil),
 		},
 		wire: pack.Message{
-			pack.Tag{wire.MaxValidNumber + 1, pack.VarintType}, pack.Varint(0),
+			pack.Tag{protowire.MaxValidNumber + 1, pack.VarintType}, pack.Varint(0),
 		}.Marshal(),
 	},
 	{
diff --git a/reflect/protodesc/desc_validate.go b/reflect/protodesc/desc_validate.go
index cf172a2..2a2bf75 100644
--- a/reflect/protodesc/desc_validate.go
+++ b/reflect/protodesc/desc_validate.go
@@ -8,7 +8,7 @@
 	"strings"
 	"unicode"
 
-	"google.golang.org/protobuf/internal/encoding/wire"
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/internal/errors"
 	"google.golang.org/protobuf/internal/filedesc"
 	"google.golang.org/protobuf/internal/flags"
@@ -210,7 +210,7 @@
 		// may have a field number higher than normal. This check only verifies
 		// that the number is not negative or reserved. We check again later
 		// if we know that the extendee is definitely not a MessageSet.
-		if n := x.Number(); n < 0 || (wire.FirstReservedNumber <= n && n <= wire.LastReservedNumber) {
+		if n := x.Number(); n < 0 || (protowire.FirstReservedNumber <= n && n <= protowire.LastReservedNumber) {
 			return errors.New("extension field %q has an invalid number: %d", x.FullName(), x.Number())
 		}
 		if !x.Cardinality().IsValid() || x.Cardinality() == protoreflect.Required {
diff --git a/reflect/protoreflect/proto.go b/reflect/protoreflect/proto.go
index eb5d289..1b89bed 100644
--- a/reflect/protoreflect/proto.go
+++ b/reflect/protoreflect/proto.go
@@ -130,7 +130,7 @@
 	"regexp"
 	"strings"
 
-	"google.golang.org/protobuf/internal/encoding/wire"
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/internal/pragma"
 )
 
@@ -366,7 +366,7 @@
 }
 
 // FieldNumber is the field number in a message.
-type FieldNumber = wire.Number
+type FieldNumber = protowire.Number
 
 // FieldNumbers represent a list of field numbers.
 type FieldNumbers interface {
diff --git a/reflect/protoreflect/value.go b/reflect/protoreflect/value.go
index 2149446..a352ed9 100644
--- a/reflect/protoreflect/value.go
+++ b/reflect/protoreflect/value.go
@@ -4,7 +4,7 @@
 
 package protoreflect
 
-import "google.golang.org/protobuf/internal/encoding/wire"
+import "google.golang.org/protobuf/encoding/protowire"
 
 // Enum is a reflection interface for a concrete enum value,
 // which provides type information and a getter for the enum number.
@@ -165,7 +165,7 @@
 // IsValid reports whether b is syntactically correct wire format.
 func (b RawFields) IsValid() bool {
 	for len(b) > 0 {
-		_, _, n := wire.ConsumeField(b)
+		_, _, n := protowire.ConsumeField(b)
 		if n < 0 {
 			return false
 		}
diff --git a/testing/protocmp/format.go b/testing/protocmp/format.go
index f329357..2be6903 100644
--- a/testing/protocmp/format.go
+++ b/testing/protocmp/format.go
@@ -12,8 +12,8 @@
 	"strconv"
 	"strings"
 
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/internal/detrand"
-	"google.golang.org/protobuf/internal/encoding/wire"
 	"google.golang.org/protobuf/reflect/protoreflect"
 )
 
@@ -134,8 +134,8 @@
 func transformRawFields(b protoreflect.RawFields) interface{} {
 	var vs []interface{}
 	for len(b) > 0 {
-		num, typ, n := wire.ConsumeTag(b)
-		m := wire.ConsumeFieldValue(num, typ, b[n:])
+		num, typ, n := protowire.ConsumeTag(b)
+		m := protowire.ConsumeFieldValue(num, typ, b[n:])
 		vs = append(vs, transformRawField(typ, b[n:][:m]))
 		b = b[n+m:]
 	}
@@ -145,28 +145,28 @@
 	return vs
 }
 
-func transformRawField(typ wire.Type, b protoreflect.RawFields) interface{} {
+func transformRawField(typ protowire.Type, b protoreflect.RawFields) interface{} {
 	switch typ {
-	case wire.VarintType:
-		v, _ := wire.ConsumeVarint(b)
+	case protowire.VarintType:
+		v, _ := protowire.ConsumeVarint(b)
 		return v
-	case wire.Fixed32Type:
-		v, _ := wire.ConsumeFixed32(b)
+	case protowire.Fixed32Type:
+		v, _ := protowire.ConsumeFixed32(b)
 		return v
-	case wire.Fixed64Type:
-		v, _ := wire.ConsumeFixed64(b)
+	case protowire.Fixed64Type:
+		v, _ := protowire.ConsumeFixed64(b)
 		return v
-	case wire.BytesType:
-		v, _ := wire.ConsumeBytes(b)
+	case protowire.BytesType:
+		v, _ := protowire.ConsumeBytes(b)
 		return v
-	case wire.StartGroupType:
+	case protowire.StartGroupType:
 		v := Message{}
 		for {
-			num2, typ2, n := wire.ConsumeTag(b)
-			if typ2 == wire.EndGroupType {
+			num2, typ2, n := protowire.ConsumeTag(b)
+			if typ2 == protowire.EndGroupType {
 				return v
 			}
-			m := wire.ConsumeFieldValue(num2, typ2, b[n:])
+			m := protowire.ConsumeFieldValue(num2, typ2, b[n:])
 			s := strconv.Itoa(int(num2))
 			b2, _ := v[s].(protoreflect.RawFields)
 			v[s] = append(b2, b[:n+m]...)
diff --git a/testing/protocmp/xform.go b/testing/protocmp/xform.go
index 8f26aa7..53dd8e6 100644
--- a/testing/protocmp/xform.go
+++ b/testing/protocmp/xform.go
@@ -16,7 +16,7 @@
 
 	"github.com/google/go-cmp/cmp"
 
-	"google.golang.org/protobuf/internal/encoding/wire"
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/proto"
 	"google.golang.org/protobuf/reflect/protoreflect"
 	"google.golang.org/protobuf/reflect/protoregistry"
@@ -238,7 +238,7 @@
 
 	// Handle unknown fields.
 	for b := m.GetUnknown(); len(b) > 0; {
-		num, _, n := wire.ConsumeField(b)
+		num, _, n := protowire.ConsumeField(b)
 		s := strconv.Itoa(int(num))
 		b2, _ := mx[s].(protoreflect.RawFields)
 		mx[s] = append(b2, b[:n]...)
diff --git a/testing/prototest/prototest.go b/testing/prototest/prototest.go
index 4fccb70..55a61ae 100644
--- a/testing/prototest/prototest.go
+++ b/testing/prototest/prototest.go
@@ -14,7 +14,7 @@
 	"testing"
 
 	"google.golang.org/protobuf/encoding/prototext"
-	"google.golang.org/protobuf/internal/encoding/wire"
+	"google.golang.org/protobuf/encoding/protowire"
 	"google.golang.org/protobuf/proto"
 	pref "google.golang.org/protobuf/reflect/protoreflect"
 	"google.golang.org/protobuf/reflect/protoregistry"
@@ -488,8 +488,8 @@
 // testUnknown tests the behavior of unknown fields.
 func testUnknown(t testing.TB, m pref.Message) {
 	var b []byte
-	b = wire.AppendTag(b, 1000, wire.VarintType)
-	b = wire.AppendVarint(b, 1001)
+	b = protowire.AppendTag(b, 1000, protowire.VarintType)
+	b = protowire.AppendVarint(b, 1001)
 	m.SetUnknown(pref.RawFields(b))
 	if got, want := []byte(m.GetUnknown()), b; !bytes.Equal(got, want) {
 		t.Errorf("after setting unknown fields:\nGetUnknown() = %v, want %v", got, want)
