diff --git a/Changelog.md b/Changelog.md
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,5 +1,14 @@
 # Changelog for `proto-lens`
 
+## v0.7.0.0
+- Support GHC 8.10.
+- Add a method to `Data.ProtoLens.Message` for getting the `DescriptorProto`
+  of a given message.  For a simpler API, see `Data.ProtoLens.Descriptor`
+  from `proto-lens-protobuf-types`.
+- Bump ghc-source-gen to version 0.4.0.0.
+- Bump upper bound to allow base-4.14.
+- Bump upper bound to allow ghc-prim-0.6.
+
 ## v0.6.0.0
 
 ### Breaking Changes
diff --git a/proto-lens.cabal b/proto-lens.cabal
--- a/proto-lens.cabal
+++ b/proto-lens.cabal
@@ -1,13 +1,13 @@
 cabal-version: 1.12
 
--- This file has been generated from package.yaml by hpack version 0.31.2.
+-- This file has been generated from package.yaml by hpack version 0.33.0.
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 5006405422ef969b41707de8219c7bbf95f72fb7bb41c12a2f22d30086de9113
+-- hash: d71629464ee51493ce31ad480ec5872af89ba3c917588b69a61484409a22896c
 
 name:           proto-lens
-version:        0.6.0.0
+version:        0.7.0.0
 synopsis:       A lens-based implementation of protocol buffers in Haskell.
 description:    The proto-lens library provides an API for protocol buffers using modern Haskell language and library patterns.  Specifically, it provides:
                 .
@@ -60,11 +60,11 @@
   hs-source-dirs:
       src
   build-depends:
-      base >=4.10 && <4.14
+      base >=4.10 && <4.15
     , bytestring ==0.10.*
     , containers >=0.5 && <0.7
     , deepseq ==1.4.*
-    , ghc-prim >=0.4 && <0.6
+    , ghc-prim >=0.4 && <0.7
     , lens-family >=1.2 && <2.1
     , parsec ==3.1.*
     , pretty ==1.1.*
diff --git a/src/Data/ProtoLens/Encoding/Wire.hs b/src/Data/ProtoLens/Encoding/Wire.hs
--- a/src/Data/ProtoLens/Encoding/Wire.hs
+++ b/src/Data/ProtoLens/Encoding/Wire.hs
@@ -16,7 +16,9 @@
     , joinTypeAndTag
     , parseFieldSet
     , buildFieldSet
+    , buildMessageSet
     , parseTaggedValueFromWire
+    , parseMessageSetTaggedValueFromWire
     ) where
 
 import Control.DeepSeq (NFData(..))
@@ -63,6 +65,15 @@
     putVarInt (joinTypeAndTag tag (wireValueToInt wv))
     <> buildWireValue wv
 
+-- builds in legacy MessageSet format.
+-- See https://github.com/protocolbuffers/protobuf/blob/dec4939439d9ca2adf2bb14edccf876c2587faf2/src/google/protobuf/descriptor.proto#L444
+buildTaggedValueAsMessageSet :: TaggedValue -> Builder
+buildTaggedValueAsMessageSet (TaggedValue (Tag t) wv) =
+    buildTaggedValue ( TaggedValue 1 StartGroup)
+    <> buildTaggedValue (TaggedValue 2 (VarInt $ fromIntegral t))
+    <> buildTaggedValue (TaggedValue 3 wv)
+    <> buildTaggedValue (TaggedValue 1 EndGroup)
+
 buildWireValue :: WireValue -> Builder
 buildWireValue (VarInt w) = putVarInt w
 buildWireValue (Fixed64 w) = putFixed64 w
@@ -98,6 +109,18 @@
         5 -> Fixed32 <$> getFixed32
         _ -> fail $ "Unknown wire type " ++ show w
 
+parseMessageSetTaggedValueFromWire :: Word64 -> Parser TaggedValue
+parseMessageSetTaggedValueFromWire t =
+    parseTaggedValueFromWire t >>= \v -> case v of
+        TaggedValue 1 StartGroup -> parseTaggedValue >>= \ft -> case ft of
+            TaggedValue 2 (VarInt f) -> parseTaggedValue >>= \dt -> case dt of
+                TaggedValue 3 (Lengthy b) -> parseTaggedValue >>= \et -> case et of
+                    TaggedValue 1 EndGroup -> return $ TaggedValue (Tag $ fromIntegral f) (Lengthy b)
+                    _ -> fail "missing end_group"
+                _ -> fail "missing message"
+            _ -> fail "missing field tag"
+        _ -> return v
+
 splitTypeAndTag :: Word64 -> (Tag, Word8)
 splitTypeAndTag w = (fromIntegral $ w `shiftR` 3, fromIntegral (w .&. 7))
 
@@ -117,3 +140,6 @@
 
 buildFieldSet :: FieldSet -> Builder
 buildFieldSet = mconcat . map buildTaggedValue 
+
+buildMessageSet :: FieldSet -> Builder
+buildMessageSet = mconcat . map buildTaggedValueAsMessageSet
diff --git a/src/Data/ProtoLens/Message.hs b/src/Data/ProtoLens/Message.hs
--- a/src/Data/ProtoLens/Message.hs
+++ b/src/Data/ProtoLens/Message.hs
@@ -75,6 +75,20 @@
     -- @"packagename.messagename"@.
     messageName :: Proxy msg -> T.Text
 
+    -- | The serialized protobuffer message descriptor for this type.
+    --
+    -- For a friendlier version which returns the actual descriptor type,
+    -- use @Data.ProtoLens.Descriptor.messageDescriptor@
+    -- from the @proto-lens-protobuf-types@ package.
+    packedMessageDescriptor :: Proxy msg -> B.ByteString
+
+    -- | The serialized protobuffer file message descriptor containing this type.
+    --
+    -- For a friendlier version which returns the actual file descriptor type,
+    -- use @Data.ProtoLens.Descriptor.fileDescriptor@
+    -- from the @proto-lens-protobuf-types@ package.
+    packedFileDescriptor :: Proxy msg -> B.ByteString
+
     -- | A message with all fields set to their default values.
     --
     -- Satisfies @encodeMessage defMessage == ""@ and @decodeMessage "" == Right defMessage@.
