diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+# 0.0.3.0
+
+- Added the `mapWithKey` function to `MonoidMap`.
+
 # 0.0.2.1
 
 - Added support for GHC 9.12.
diff --git a/monoidmap.cabal b/monoidmap.cabal
--- a/monoidmap.cabal
+++ b/monoidmap.cabal
@@ -1,6 +1,6 @@
 cabal-version:  3.0
 name:           monoidmap
-version:        0.0.2.1
+version:        0.0.3.0
 bug-reports:    https://github.com/jonathanknowles/monoidmap/issues
 license:        Apache-2.0
 license-file:   LICENSE
diff --git a/src/examples/Examples/RecoveredMap.hs b/src/examples/Examples/RecoveredMap.hs
--- a/src/examples/Examples/RecoveredMap.hs
+++ b/src/examples/Examples/RecoveredMap.hs
@@ -20,6 +20,7 @@
     , lookup
     , member
     , map
+    , mapWithKey
     , mapAccumL
     , mapAccumLWithKey
     , mapAccumR
@@ -91,6 +92,9 @@
 
 map :: (v1 -> v2) -> Map k v1 -> Map k v2
 map f = Map . MonoidMap.map (fmap f) . unMap
+
+mapWithKey :: (k -> v1 -> v2) -> Map k v1 -> Map k v2
+mapWithKey f = Map . MonoidMap.mapWithKey (fmap . f) . unMap
 
 mapAccumL :: (s -> v1 -> (s, v2)) -> s -> Map k v1 -> (s, Map k v2)
 mapAccumL f s m = Map <$> MonoidMap.mapAccumL (accum f) s (unMap m)
diff --git a/src/internal/Data/MonoidMap/Internal.hs b/src/internal/Data/MonoidMap/Internal.hs
--- a/src/internal/Data/MonoidMap/Internal.hs
+++ b/src/internal/Data/MonoidMap/Internal.hs
@@ -65,6 +65,7 @@
     , map
     , mapKeys
     , mapKeysWith
+    , mapWithKey
 
     -- ** Folding
     , foldl
@@ -1004,6 +1005,28 @@
     -> MonoidMap k1 v
     -> MonoidMap k2 v
 mapKeysWith combine fk = fromListWith combine . fmap (B.first fk) . toList
+
+-- | \(O(n)\). Applies a key-dependent function to all non-'C.null' values of
+--   a 'MonoidMap'.
+--
+-- Satisfies the following properties for all functions __@f@__:
+--
+-- @
+-- ('nonNullKey' k m) ==> ('get' k ('mapWithKey' f m) '==' f k ('get' k m))
+-- (   'nullKey' k m) ==> ('get' k ('mapWithKey' f m) '==' 'mempty'       )
+-- @
+--
+-- @since 0.0.3.0
+--
+mapWithKey
+    :: MonoidNull v2
+    => (k -> v1 -> v2)
+    -> MonoidMap k v1
+    -> MonoidMap k v2
+mapWithKey f (MonoidMap m) =
+    MonoidMap . runIdentity $
+    Map.traverseMaybeWithKey
+        (\k v -> Identity $ maybeNonNull $ applyNonNull (f k) v) m
 
 --------------------------------------------------------------------------------
 -- Lazy folding
diff --git a/src/public/Data/MonoidMap.hs b/src/public/Data/MonoidMap.hs
--- a/src/public/Data/MonoidMap.hs
+++ b/src/public/Data/MonoidMap.hs
@@ -64,6 +64,7 @@
     , map
     , mapKeys
     , mapKeysWith
+    , mapWithKey
 
     -- ** Folding
     , foldl
diff --git a/src/test/Data/MonoidMap/MapSpec.hs b/src/test/Data/MonoidMap/MapSpec.hs
--- a/src/test/Data/MonoidMap/MapSpec.hs
+++ b/src/test/Data/MonoidMap/MapSpec.hs
@@ -71,6 +71,18 @@
     it "prop_mapKeysWith_asList" $
         prop_mapKeysWith_asList
             @k @v & property
+    it "prop_mapWithKey_asList" $
+        prop_mapWithKey_asList
+            @k @v & property
+    it "prop_mapWithKey_get" $
+        prop_mapWithKey_get
+            @k @v & property
+    it "prop_mapWithKey_get_total" $
+        prop_mapWithKey_get_total
+            @k @v & property
+    it "prop_mapWithKey_get_total_failure" $
+        prop_mapWithKey_get_total_failure
+            @k @v & property
 
 --------------------------------------------------------------------------------
 -- Mapping
@@ -206,6 +218,68 @@
         "0 < nonNullCount n && nonNullCount n < nonNullCount m"
   where
     n = MonoidMap.mapKeysWith c f m
+
+prop_mapWithKey_asList
+    :: Test k v
+    => Fun (k, v) v
+    -> MonoidMap k v
+    -> Property
+prop_mapWithKey_asList (applyFun2 -> f) m =
+    n ===
+        ( MonoidMap.fromList
+        . fmap (\(k, v) -> (k, (f k v)))
+        . MonoidMap.toList
+        $ m
+        )
+    & cover 2
+        (0 < nonNullCount n && nonNullCount n < nonNullCount m)
+        "0 < nonNullCount n && nonNullCount n < nonNullCount m"
+  where
+    n = MonoidMap.mapWithKey f m
+
+prop_mapWithKey_get
+    :: Test k v
+    => Fun (k, v) v
+    -> k
+    -> MonoidMap k v
+    -> Property
+prop_mapWithKey_get (applyFun2 -> f) k m =
+    MonoidMap.get k (MonoidMap.mapWithKey f m)
+    ===
+    (if MonoidMap.nullKey k m then mempty else f k (MonoidMap.get k m))
+    & cover 2
+        (MonoidMap.nullKey k m)
+        "MonoidMap.nullKey k m"
+    & cover 2
+        (MonoidMap.nonNullKey k m)
+        "MonoidMap.nonNullKey k m"
+
+prop_mapWithKey_get_total
+    :: forall k v. Test k v
+    => Fun (k, v) v
+    -> k
+    -> MonoidMap k v
+    -> Property
+prop_mapWithKey_get_total (applyFun2 -> f0) k m =
+    MonoidMap.get k (MonoidMap.mapWithKey f m) === f k (MonoidMap.get k m)
+    & cover 2
+        (MonoidMap.nullKey k m)
+        "MonoidMap.nullKey k m"
+    & cover 2
+        (MonoidMap.nonNullKey k m)
+        "MonoidMap.nonNullKey k m"
+  where
+    f = toNullPreservingFn . f0
+
+prop_mapWithKey_get_total_failure
+    :: Test k v
+    => Fun (k, v) v
+    -> k
+    -> MonoidMap k v
+    -> Property
+prop_mapWithKey_get_total_failure (applyFun2 -> f) k m =
+    expectFailure $
+    MonoidMap.get k (MonoidMap.mapWithKey f m) === f k (MonoidMap.get k m)
 
 --------------------------------------------------------------------------------
 -- Utilities
diff --git a/src/test/Data/MonoidMap/ValiditySpec.hs b/src/test/Data/MonoidMap/ValiditySpec.hs
--- a/src/test/Data/MonoidMap/ValiditySpec.hs
+++ b/src/test/Data/MonoidMap/ValiditySpec.hs
@@ -192,6 +192,9 @@
     it "propValid_mapKeysWith" $
         propValid_mapKeysWith
             @k @v & property
+    it "propValid_mapWithKey" $
+        propValid_mapWithKey
+            @k @v & property
     it "propValid_mapAccumL" $
         propValid_mapAccumL
             @k @v & property
@@ -503,6 +506,11 @@
     :: Test k v => Fun (v, v) v -> Fun k k -> MonoidMap k v -> Property
 propValid_mapKeysWith (applyFun2 -> f) (applyFun -> g) m =
     propValid (MonoidMap.mapKeysWith f g m)
+
+propValid_mapWithKey
+    :: Test k v => Fun (k, v) v -> MonoidMap k v -> Property
+propValid_mapWithKey (applyFun2 -> f) m =
+    propValid (MonoidMap.mapWithKey f m)
 
 propValid_mapAccumL
     :: forall k v s. s ~ Int
diff --git a/src/test/Examples/RecoveredMapSpec.hs b/src/test/Examples/RecoveredMapSpec.hs
--- a/src/test/Examples/RecoveredMapSpec.hs
+++ b/src/test/Examples/RecoveredMapSpec.hs
@@ -189,6 +189,9 @@
             it "prop_map_mempty" $
                 prop_map_mempty
                     @k @v @v & property
+            it "prop_mapWithKey" $
+                prop_mapWithKey
+                    @k @v @v & property
 
         describe "MapAccumL" $ do
             it "prop_mapAccumL @Int" $
@@ -497,6 +500,16 @@
     (===)
         (RMap.toList (RMap.map (const (mempty @v2)) (RMap.fromList kvs)))
         (OMap.toList (OMap.map (const (mempty @v2)) (OMap.fromList kvs)))
+
+prop_mapWithKey
+    :: (Ord k, Show k, Eq v2, Show v2)
+    => [(k, v1)]
+    -> Fun (k, v1) v2
+    -> Property
+prop_mapWithKey kvs (applyFun2 -> f) =
+    (===)
+        (RMap.toList (RMap.mapWithKey f (RMap.fromList kvs)))
+        (OMap.toList (OMap.mapWithKey f (OMap.fromList kvs)))
 
 --------------------------------------------------------------------------------
 -- MapAccum
