diff --git a/Data/Map/Class.hs b/Data/Map/Class.hs
--- a/Data/Map/Class.hs
+++ b/Data/Map/Class.hs
@@ -15,9 +15,14 @@
 import qualified Data.Map as M
 import qualified Data.Map.Merge.Lazy as M
 import Data.Monoid (Dual (..), Last (..))
-import Util ((∘), (∘∘), compose2)
+import Util ((∘), (∘∘), compose2, bind2)
 import Util.Private (Endo (..))
 
+-- | Laws:
+--
+-- * @'adjustA' 'pure' _ = 'pure'@
+--
+-- * @'adjustA' 'Const' k '<=<' 'traverseWithKey' f = 'fmap' 'Const' '.' f k '<=<' 'getConst' '.' 'adjustA' 'Const' k@
 class Traversable map => StaticMap map where
     type Key map
     adjustA :: Applicative p => (a -> p a) -> Key map -> map a -> p (map a)
@@ -186,6 +191,12 @@
 
 fromListWithKey :: Map map => (Key map -> a -> a -> a) -> [(Key map, a)] -> map a
 fromListWithKey f = Foldable.foldl' (flip . uncurry $ insertWith =<< f) empty
+
+fromListWithM :: (Map map, Monad m) => (a -> a -> m a) -> [(Key map, a)] -> m (map a)
+fromListWithM = fromListWithKeyM . pure
+
+fromListWithKeyM :: (Map map, Monad m) => (Key map -> a -> a -> m a) -> [(Key map, a)] -> m (map a)
+fromListWithKeyM f = sequenceA . fromListWithKey (bind2 . f) . (fmap . fmap) pure
 
 adjustLookupA :: (StaticMap map, Applicative p) => (a -> p a) -> Key map -> map a -> p (Maybe a, map a)
 adjustLookupA f = sequenceA ∘∘ (getLast *** id <<< getCompose) ∘∘ adjustA (\ a -> Compose (pure a, f a))
diff --git a/Map.cabal b/Map.cabal
--- a/Map.cabal
+++ b/Map.cabal
@@ -1,5 +1,5 @@
 name:                Map
-version:             0.1.1.0
+version:             0.1.2.0
 synopsis:            Class of key-value maps
 -- description:
 license:             BSD3
