diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+# 0.1.2.1
+
+- No changes to the library itself. The package description (.cabal file)
+  changed to the standard.
+
 # 0.1.2
 
 - Add Data.Bimatchable
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright Koji Miyazato (c) 2018
+Copyright Koji Miyazato (c) 2018-2019
 
 All rights reserved.
 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,11 +1,14 @@
+[![Haskell CI](https://github.com/viercc/matchable/actions/workflows/haskell.yml/badge.svg)](https://github.com/viercc/matchable/actions/workflows/haskell.yml)
+
 ## matchable
 
-This package provides a type class `Matchable`, which represents
-`zipMatch` operation which can zip two values.
+This package defines a type class `Matchable`,
+which provides `zipMatch` operation for zipping two values of a
+container type.
 
-`zipMatch` operation can fail, and it returns zipped value wrapped
+The `zipMatch` operation can fail. It returns the zipped value wrapped
 in `Maybe`. Specifically, `zipMatch` returns zipped value if and only if two arguments
-have exactly same shape.
+have the exactly same shape.
 
 ### Example
 
@@ -16,4 +19,4 @@
 Nothing
 ```
 
-See [example](https://github.com/viercc/matchable/blob/master/example/README.md) also.
+See [examples](https://github.com/viercc/matchable/blob/master/example/README.md) also.
diff --git a/matchable.cabal b/matchable.cabal
--- a/matchable.cabal
+++ b/matchable.cabal
@@ -1,17 +1,19 @@
 name:                matchable
-version:             0.1.2
+version:             0.1.2.1
 synopsis:            A type class for Matchable Functors.
-description:         This package provides a type class @Matchable@, which represents
-                     @zipMatch@ operation which can zip two values if these two have
-                     exactly same shape.
+description:         This package defines a type class @Matchable@, providing
+                     @zipMatch@ operation for zipping two values of any container-like
+                     functor type.
 license:             BSD3
 license-file:        LICENSE
 author:              Koji Miyazato
 maintainer:          viercc@gmail.com
 category:            Functors
 build-type:          Simple
-extra-source-files:  README.md, CHANGELOG.md
-cabal-version:       >=1.10
+extra-source-files:  README.md
+extra-doc-files:     CHANGELOG.md
+cabal-version:       2.0
+tested-with:         GHC ==9.0.2, GHC ==9.2.7, GHC ==9.4.4, GHC ==9.6.1
 
 source-repository head
   type:     git
@@ -25,17 +27,16 @@
   build-depends:        base                 >=4.10      && <5,
                         containers           >=0.5.10.2  && <0.7,
                         tagged               >=0.8       && <0.9,
-                        hashable             >=1.0.1.1   && <1.3,
+                        hashable             >=1.0.1.1   && <1.5,
                         unordered-containers >=0.2.6     && <0.3,
-                        vector               >=0.10.9.0  && <0.13
+                        vector               >=0.10.9.0  && <0.14
   ghc-options:          -Wall
   default-language:     Haskell2010
 
-test-suite examples
+test-suite matchable-test
   type:                exitcode-stdio-1.0
   hs-source-dirs:      test
   main-is:             example.hs
-  build-depends:       base, containers, matchable, hspec, doctest
-  ghc-options:         -Wall
+  build-depends:       base, containers, matchable, hspec
   default-language:    Haskell2010
 
diff --git a/src/Data/Matchable.hs b/src/Data/Matchable.hs
--- a/src/Data/Matchable.hs
+++ b/src/Data/Matchable.hs
@@ -35,6 +35,7 @@
 import           Data.Map.Lazy          (Map)
 import qualified Data.Map.Lazy          as Map
 import           Data.IntMap.Lazy       (IntMap)
+import qualified Data.IntMap.Lazy       as IntMap
 import qualified Data.IntMap.Merge.Lazy as IntMap
 import           Data.Tree              (Tree)
 import           Data.Sequence          (Seq)
@@ -49,6 +50,11 @@
 
 import           GHC.Generics
 
+-- $setup
+-- This is required to silence "type defaults" warning, which clutters GHCi
+-- output and makes doctests fail.
+-- >>> :set -Wno-type-defaults
+
 -- | Containers that allows exact structural matching of two containers.
 class (Eq1 t, Functor t) => Matchable t where
   {- |
@@ -177,19 +183,6 @@
 instance (Eq e) => Matchable (Either e) where
   zipMatchWith = genericZipMatchWith
 
-instance (Eq k) => Matchable (Map k) where
-  zipMatchWith u ma mb =
-    Map.fromAscList <$> zipMatchWith (zipMatchWith u) (Map.toAscList ma) (Map.toAscList mb)
-
-instance Matchable IntMap where
-  zipMatchWith u =
-    IntMap.mergeA (IntMap.traverseMissing (\_ _ -> Nothing))
-                  (IntMap.traverseMissing (\_ _ -> Nothing))
-                  (IntMap.zipWithAMatched (const u))
-
-instance Matchable Tree where
-  zipMatchWith = genericZipMatchWith
-
 instance Matchable Seq where
   zipMatch as bs
     | Seq.length as == Seq.length bs = Just (Seq.zip as bs)
@@ -197,6 +190,24 @@
   zipMatchWith u as bs
     | Seq.length as == Seq.length bs = unsafeFillIn u as (Data.Foldable.toList bs)
     | otherwise                      = Nothing
+
+instance (Eq k) => Matchable (Map k) where
+  zipMatchWith u as bs
+    | Map.size as == Map.size bs =
+        Map.fromDistinctAscList <$>
+          zipMatchWith (zipMatchWith u) (Map.toAscList as) (Map.toAscList bs)
+    | otherwise                  = Nothing
+
+instance Matchable IntMap where
+  zipMatchWith u as bs
+    | IntMap.size as == IntMap.size bs = merger as bs
+    | otherwise = Nothing
+    where
+      miss = IntMap.traverseMissing (\_ _ -> Nothing)
+      merger = IntMap.mergeA miss miss (IntMap.zipWithAMatched (const u))
+
+instance Matchable Tree where
+  zipMatchWith = genericZipMatchWith
 
 instance Matchable Vector where
   zipMatch as bs
