diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+# 0.1.0.0
+
+- Made `MonoidMap` an instance of both `Typeable` and `Data`.
+
 # 0.0.0.1
 
 - Revised version bounds of dependencies.
diff --git a/components/monoidmap-internal/Data/MonoidMap/Internal.hs b/components/monoidmap-internal/Data/MonoidMap/Internal.hs
--- a/components/monoidmap-internal/Data/MonoidMap/Internal.hs
+++ b/components/monoidmap-internal/Data/MonoidMap/Internal.hs
@@ -164,6 +164,15 @@
     ( Bifoldable )
 import Data.Coerce
     ( coerce )
+import Data.Data
+    ( Constr
+    , Data (dataCast2, dataTypeOf, gfoldl, gunfold, toConstr)
+    , DataType
+    , Fixity (Prefix)
+    , gcast2
+    , mkConstr
+    , mkDataType
+    )
 import Data.Function
     ( (&) )
 import Data.Functor.Classes
@@ -204,6 +213,8 @@
     )
 import Data.Set
     ( Set )
+import Data.Typeable
+    ( Typeable )
 import GHC.Exts
     ( IsList (Item) )
 import NoThunks.Class
@@ -232,7 +243,7 @@
 --------------------------------------------------------------------------------
 
 newtype MonoidMap k v = MonoidMap (Map k (NonNull v))
-    deriving (Eq, Show, NFData, NoThunks)
+    deriving (Eq, Show, NFData, NoThunks, Typeable)
         via Map k v
     deriving (Eq1, Show1, Foldable)
         via Map k
@@ -277,6 +288,28 @@
     Read (MonoidMap k v)
   where
     readPrec = fromMap <$> readPrec
+
+--------------------------------------------------------------------------------
+-- Instances: Data
+--------------------------------------------------------------------------------
+
+-- This implementation is closely based on the 'Data' instance for 'Map'
+-- provided by the 'containers' package (version 0.8).
+--
+instance (Data k, Data v, Ord k, MonoidNull v) => Data (MonoidMap k v) where
+    dataTypeOf _ = dataType
+    dataCast2 f = gcast2 f
+    gfoldl f z m = z fromList `f` toList m
+    gunfold k z c
+        | c == fromListConstr = k (z fromList)
+        | otherwise = error "gunfold MonoidMap: unexpected constructor"
+    toConstr _ = fromListConstr
+
+dataType :: DataType
+dataType = mkDataType "Data.MonoidMap.Internal.MonoidMap" [fromListConstr]
+
+fromListConstr :: Constr
+fromListConstr = mkConstr dataType "fromList" [] Prefix
 
 --------------------------------------------------------------------------------
 -- Instances: Semigroup and subclasses
diff --git a/components/monoidmap-test/Data/MonoidMap/Internal/ExampleSpec.hs b/components/monoidmap-test/Data/MonoidMap/Internal/ExampleSpec.hs
--- a/components/monoidmap-test/Data/MonoidMap/Internal/ExampleSpec.hs
+++ b/components/monoidmap-test/Data/MonoidMap/Internal/ExampleSpec.hs
@@ -1,4 +1,6 @@
+{-# LANGUAGE DeriveDataTypeable #-}
 {-# LANGUAGE OverloadedLists #-}
+{-# LANGUAGE RankNTypes #-}
 {-# OPTIONS_GHC -fno-warn-orphans #-}
 {- HLINT ignore "Redundant bracket" -}
 {- HLINT ignore "Use camelCase" -}
@@ -14,10 +16,14 @@
 import Prelude hiding
     ( gcd, lcm )
 
+import Data.Data
+    ( Data, cast, gmapT )
 import Data.Function
     ( (&) )
 import Data.Group
     ( Group (..) )
+import Data.Maybe
+    ( fromMaybe )
 import Data.Monoid
     ( Product (..), Sum (..) )
 import Data.Monoid.GCD
@@ -66,6 +72,18 @@
         exampleSpec_disjoint_Sum_Natural
         exampleSpec_disjoint_Set_Natural
 
+    describe "Data" $ do
+
+        exampleSpec_gmapT_keys_id
+        exampleSpec_gmapT_keys_div_2
+        exampleSpec_gmapT_keys_mod_2
+        exampleSpec_gmapT_keys_mul_2
+
+        exampleSpec_gmapT_values_id
+        exampleSpec_gmapT_values_div_2
+        exampleSpec_gmapT_values_mod_2
+        exampleSpec_gmapT_values_mul_2
+
     describe "Intersection" $ do
 
         exampleSpec_intersectionWith_min_Sum_Natural
@@ -328,6 +346,111 @@
     m = MonoidMap.fromList . zip [A ..] . fmap Set.fromList
 
 --------------------------------------------------------------------------------
+-- Data
+--------------------------------------------------------------------------------
+
+exampleSpec_gmapT_keys_id :: Spec
+exampleSpec_gmapT_keys_id =
+    unitTestSpec "gmapT_keys" "id"
+    (mapNaturals id)
+    (unitTestData1
+      [ ( [(1, "a"), (2, "b"), (3, "c"), (4, "d")] :: MonoidMap Natural String
+        , [(1, "a"), (2, "b"), (3, "c"), (4, "d")] :: MonoidMap Natural String
+        )
+      ]
+    )
+
+exampleSpec_gmapT_keys_div_2 :: Spec
+exampleSpec_gmapT_keys_div_2 =
+    unitTestSpec "gmapT_keys" "div_2"
+    (mapNaturals (`div` 2))
+    (unitTestData1
+      [ ( [(2, "a"), (4, "b"), (6, "c"), (8, "d")] :: MonoidMap Natural String
+        , [(1, "a"), (2, "b"), (3, "c"), (4, "d")] :: MonoidMap Natural String
+        )
+      ]
+    )
+
+exampleSpec_gmapT_keys_mod_2 :: Spec
+exampleSpec_gmapT_keys_mod_2 =
+    unitTestSpec "gmapT_keys" "mod_2"
+    (mapNaturals (`mod` 2))
+    (unitTestData1
+      [ ( [(0, "a"), (2, "b"), (1, "c"), (3, "d")] :: MonoidMap Natural String
+        , [(0, "a"    <> "b"), (1, "c"    <> "d")] :: MonoidMap Natural String
+        )
+      ]
+    )
+
+exampleSpec_gmapT_keys_mul_2 :: Spec
+exampleSpec_gmapT_keys_mul_2 =
+    unitTestSpec "gmapT_keys" "mul_2"
+    (mapNaturals (* 2))
+    (unitTestData1
+      [ ( [(1, "a"), (2, "b"), (3, "c"), (4, "d")] :: MonoidMap Natural String
+        , [(2, "a"), (4, "b"), (6, "c"), (8, "d")] :: MonoidMap Natural String
+        )
+      ]
+    )
+
+exampleSpec_gmapT_values_id :: Spec
+exampleSpec_gmapT_values_id =
+    unitTestSpec "gmapT_values" "id"
+    (mapNaturals id)
+    (unitTestData1
+      [ ( [(A, 1), (B, 2), (C, 3), (D, 4)] :: MonoidMap LatinChar (Sum Natural)
+        , [(A, 1), (B, 2), (C, 3), (D, 4)] :: MonoidMap LatinChar (Sum Natural)
+        )
+      ]
+    )
+
+exampleSpec_gmapT_values_div_2 :: Spec
+exampleSpec_gmapT_values_div_2 =
+    unitTestSpec "gmapT_values" "div_2"
+    (mapNaturals (`div` 2))
+    (unitTestData1
+      [ ( [(A, 2), (B, 4), (C, 6), (D, 8)] :: MonoidMap LatinChar (Sum Natural)
+        , [(A, 1), (B, 2), (C, 3), (D, 4)] :: MonoidMap LatinChar (Sum Natural)
+        )
+      ]
+    )
+
+exampleSpec_gmapT_values_mod_2 :: Spec
+exampleSpec_gmapT_values_mod_2 =
+    unitTestSpec "gmapT_values" "mod_2"
+    (mapNaturals (`mod` 2))
+    (unitTestData1
+      [ ( [(A, 1), (B, 2), (C, 3), (D, 4)] :: MonoidMap LatinChar (Sum Natural)
+        , [(A, 1),         (C, 1)        ] :: MonoidMap LatinChar (Sum Natural)
+        )
+      ]
+    )
+
+exampleSpec_gmapT_values_mul_2 :: Spec
+exampleSpec_gmapT_values_mul_2 =
+    unitTestSpec "gmapT_values" "mul_2"
+    (mapNaturals (* 2))
+    (unitTestData1
+      [ ( [(A, 1), (B, 2), (C, 3), (D, 4)] :: MonoidMap LatinChar (Sum Natural)
+        , [(A, 2), (B, 4), (C, 6), (D, 8)] :: MonoidMap LatinChar (Sum Natural)
+        )
+      ]
+    )
+
+mapNaturals :: Data a => (Natural -> Natural) -> a -> a
+mapNaturals f =
+    everywhereT $ \x ->
+        case (cast x) of
+            Just (n :: Natural) ->
+                fromMaybe
+                    (error "mapNaturals")
+                    (cast (f n))
+            Nothing -> x
+
+everywhereT :: Data a => (forall b. Data b => b -> b) -> a -> a
+everywhereT f x = f (gmapT (everywhereT f) x)
+
+--------------------------------------------------------------------------------
 -- Intersection
 --------------------------------------------------------------------------------
 
@@ -1735,4 +1858,4 @@
 data LatinChar
     = A | B | C | D | E | F | G | H | I | J | K | L | M
     | N | O | P | Q | R | S | T | U | V | W | X | Y | Z
-    deriving (Bounded, Enum, Eq, Ord, Show)
+    deriving (Bounded, Enum, Eq, Ord, Show, Data)
diff --git a/monoidmap-internal.cabal b/monoidmap-internal.cabal
--- a/monoidmap-internal.cabal
+++ b/monoidmap-internal.cabal
@@ -1,6 +1,6 @@
 cabal-version:  3.0
 name:           monoidmap-internal
-version:        0.0.0.1
+version:        0.1.0.0
 bug-reports:    https://github.com/jonathanknowles/monoidmap-internal/issues
 license:        Apache-2.0
 license-file:   LICENSE
