diff --git a/DocTest.hs b/DocTest.hs
--- a/DocTest.hs
+++ b/DocTest.hs
@@ -1,6 +1,8 @@
 import Test.DocTest
-main = doctest [ "-isrc"
-               , "-XOverloadedStrings"
+main = doctest [ "-XOverloadedStrings"
+               , "-XCPP"
+               , "-XLambdaCase"
+               , "lib/Data/Aeson/Combinators/Compat.hs"
                , "lib/Data/Aeson/Combinators/Decode.hs"
                , "lib/Data/Aeson/Combinators/Encode.hs"
                ]
diff --git a/aeson-combinators.cabal b/aeson-combinators.cabal
--- a/aeson-combinators.cabal
+++ b/aeson-combinators.cabal
@@ -1,6 +1,6 @@
 cabal-version:       >=1.10
 name:                aeson-combinators
-version:             0.0.5.0
+version:             0.1.0.0
 synopsis:            Aeson combinators for dead simple JSON decoding
 description:
     Low overhead value space `Decoder`
@@ -18,12 +18,11 @@
 extra-source-files:  README.md
                    , CHANGELOG.md
 homepage:            https://github.com/turboMaCk/aeson-combinators
-tested-with:         GHC == 8.4.4
-                   , GHC == 8.6.5
-                   , GHC == 8.8.3
-                   , GHC == 8.8.4
-                   , GHC == 8.10.1
-                   , GHC == 8.10.3
+tested-with:         GHC == 8.8.4
+                   , GHC == 8.10.7
+                   , GHC == 9.0.2
+                   , GHC == 9.2.1
+                   , GHC == 9.2.2
                    , GHCJS == 8.6.0.1
 
 Flag doctest
@@ -33,7 +32,7 @@
 library
   exposed-modules:     Data.Aeson.Combinators.Decode
                      , Data.Aeson.Combinators.Encode
-  -- other-modules:
+  other-modules:       Data.Aeson.Combinators.Compat
   -- other-extensions:
   build-depends:       base >= 4 && < 5
                      , bytestring
diff --git a/lib/Data/Aeson/Combinators/Compat.hs b/lib/Data/Aeson/Combinators/Compat.hs
new file mode 100644
--- /dev/null
+++ b/lib/Data/Aeson/Combinators/Compat.hs
@@ -0,0 +1,67 @@
+{-# LANGUAGE CPP #-}
+-- |
+-- Module      : Data.Aeson.Combinators.Decode
+-- Copyright   : (c) Marek Fajkus
+-- License     : BSD3
+--
+-- Maintainer  : marek.faj@gmail.com
+--
+-- Aeson compatibility layer to support Aeson 2.0 and older versions.
+-- Re-exposes 'Key' and 'KeyMap', together with suitable conversion functions.
+-- For older aeson versions, we provide type definitions for 'Key' and
+-- 'KeyMap'.
+--
+-- Users may use 'fromText' and 'toText' to write decoders/encoders for
+-- forwards and backwards compatibility.
+--
+module Data.Aeson.Combinators.Compat (
+-- * Aeson compatibility helpers
+--
+-- $doc
+--
+-- ** KeyMap
+  KeyMap
+  , toHashMapText
+-- ** Key
+  , Key
+  , toText, fromText
+) where
+
+#if (MIN_VERSION_aeson(2,0,0))
+import           Data.Aeson.Key             (Key, toText, fromText)
+import           Data.Aeson.KeyMap          (KeyMap)
+import           Data.Aeson.KeyMap          (toHashMapText)
+#else
+import qualified Data.HashMap.Lazy          as HL
+import           Data.Text                  (Text)
+
+-- | Forward compatible type-def for Aeson 2.0 'KeyMap' type.
+type KeyMap a = HL.HashMap Text a
+
+toHashMapText :: HL.HashMap Text a -> HL.HashMap Text a
+toHashMapText = id
+
+-- | Forward compatible type-def for Aeson 2.0 'Key' type.
+type Key = Text
+
+-- | Aeson 2.0 compatibility function for the 'Key' type.
+fromText :: Text -> Text
+fromText = id
+
+-- | Aeson 2.0 compatibility function for the 'Key' type.
+toText :: Text -> Text
+toText = id
+#endif
+
+-- $doc
+-- Aeson compatibility layer to support Aeson 2.0 and older versions.
+-- Re-exposes 'Key' and 'KeyMap', together with suitable conversion functions.
+-- For older aeson versions, we provide type definitions for 'Key' and
+-- 'KeyMap'.
+--
+-- Users may use 'fromText' and 'toText' to write decoders/encoders for
+-- forwards and backwards compatibility.
+--
+-- See [Key](https://hackage.haskell.org/package/aeson-2.0.3.0/docs/Data-Aeson-Key.html)
+-- and [KeyMap](https://hackage.haskell.org/package/aeson-2.0.3.0/docs/Data-Aeson-KeyMap.html)
+-- in [aeson >= 2.0](https://hackage.haskell.org/package/aeson) for more details.
diff --git a/lib/Data/Aeson/Combinators/Decode.hs b/lib/Data/Aeson/Combinators/Decode.hs
--- a/lib/Data/Aeson/Combinators/Decode.hs
+++ b/lib/Data/Aeson/Combinators/Decode.hs
@@ -2,7 +2,7 @@
 {-# LANGUAGE LambdaCase #-}
 
 -- |
--- Module      : Data.Aeson.Cominators.Decode
+-- Module      : Data.Aeson.Combinators.Decode
 -- Copyright   : (c) Marek Fajkus
 -- License     : BSD3
 --
@@ -32,8 +32,8 @@
   , nullable
 -- *** Sequences
   , list, vector
--- *** Hashmap
-  , hashMapLazy, hashMapStrict
+-- *** Hashmap and Map
+  , hashMapLazy, hashMapStrict, keyMap
 -- *** Map
   , mapLazy, mapStrict
 -- * Combinators
@@ -88,6 +88,7 @@
 -- * Parsing (Running Decoders)
   , parseMaybe
   , parseEither
+  , module Data.Aeson.Combinators.Compat
   ) where
 
 import           Prelude                    hiding (either, fail, maybe)
@@ -98,6 +99,7 @@
 import           Control.Monad.Fail         (MonadFail (..))
 import qualified Control.Monad.Fail         as Fail
 
+import           Data.Aeson.Combinators.Compat
 import           Data.Aeson.Internal        (JSONPath, JSONPathElement (..))
 import qualified Data.Aeson.Internal        as AI
 import qualified Data.Aeson.Parser          as Parser
@@ -346,7 +348,7 @@
 -- using provided 'Decoder'.
 hashMapLazy :: Decoder a -> Decoder (HL.HashMap Text a)
 hashMapLazy (Decoder d) = Decoder $ \case
-  Object xs -> traverse d xs
+  Object xs -> toHashMapText <$> traverse d xs
   val       -> typeMismatch "Array" val
 {-# INLINE hashMapLazy #-}
 
@@ -355,10 +357,17 @@
 -- using provided 'Decoder'.
 hashMapStrict :: Decoder a -> Decoder (HS.HashMap Text a)
 hashMapStrict (Decoder d) = Decoder $ \case
-  Object xs -> traverse d xs
+  Object xs -> toHashMapText <$> traverse d xs
   val       -> typeMismatch "Array" val
 {-# INLINE hashMapStrict #-}
 
+-- | Decode JSON object to 'KeyMap' with 'Key' key
+-- using provided 'Decoder'.
+keyMap :: Decoder a -> Decoder (KeyMap a)
+keyMap (Decoder d) = Decoder $ \case
+  Object xs -> traverse d xs
+  val       -> typeMismatch "Array" val
+{-# INLINE keyMap #-}
 
 -- | Decode JSON object to 'ML.Map' with 'Data.Text' key
 -- using provided 'Decoder'.
@@ -399,7 +408,7 @@
 --
 -- >>> decode (key "data" int) "{\"data\": 42}"
 -- Just 42
-key :: Text -> Decoder a -> Decoder a
+key :: Key -> Decoder a -> Decoder a
 key t (Decoder d) = Decoder $ \case
   Object v -> d =<< v .: t
   val      -> typeMismatch "Object" val
@@ -410,7 +419,7 @@
 --
 -- >>> decode (at ["data", "value"] int) "{\"data\": {\"value\": 42}}"
 -- Just 42
-at :: [Text] -> Decoder a -> Decoder a
+at :: [Key] -> Decoder a -> Decoder a
 at pth d = foldr key d pth
 {-# INLINE at #-}
 
diff --git a/lib/Data/Aeson/Combinators/Encode.hs b/lib/Data/Aeson/Combinators/Encode.hs
--- a/lib/Data/Aeson/Combinators/Encode.hs
+++ b/lib/Data/Aeson/Combinators/Encode.hs
@@ -1,7 +1,7 @@
 {-# LANGUAGE CPP #-}
 
 -- |
--- Module      : Data.Aeson.Cominators.Encode
+-- Module      : Data.Aeson.Combinators.Encode
 -- Copyright   : (c) Marek Fajkus
 -- License     : BSD3
 --
@@ -21,7 +21,7 @@
 -- * Importing
 -- $importing
 
--- * Aleternative to using 'Encode' Combinators
+-- * Alternative to using 'Encode' Combinators
 -- $alternative
 
 -- * Example Usage
@@ -71,6 +71,7 @@
   -- * Evaluating Encoders
   , encode
   , toEncoding
+  , module Data.Aeson.Combinators.Compat
 ) where
 
 import           Control.Applicative
@@ -79,6 +80,7 @@
 
 import           Data.Aeson                 (ToJSON, Value (..))
 import qualified Data.Aeson                 as Aeson
+import           Data.Aeson.Combinators.Compat
 import qualified Data.Aeson.Encoding        as E
 import           Data.Aeson.Types           (Pair)
 import qualified Data.ByteString.Lazy       as BS
@@ -285,7 +287,7 @@
 
 
 {-| Define object field -}
-field :: Text -> Encoder b -> (a -> b) -> KeyValueEncoder a
+field :: Key -> Encoder b -> (a -> b) -> KeyValueEncoder a
 field name (Encoder enc) get v = (name, enc $ get v)
 {-# INLINE field #-}
 
@@ -322,7 +324,7 @@
 
 
 {-| Define object field (alternative) -}
-field' :: Text -> Encoder a -> a -> (Text, Value)
+field' :: Key -> Encoder a -> a -> (Key, Value)
 field' name (Encoder enc) val = (name, enc val)
 {-# INLINE field' #-}
 
diff --git a/test/JSONDecodeSpec.hs b/test/JSONDecodeSpec.hs
--- a/test/JSONDecodeSpec.hs
+++ b/test/JSONDecodeSpec.hs
@@ -10,7 +10,6 @@
 import           Data.Aeson.Types              (FromJSON (..))
 import           Data.ByteString.Lazy
 import           Data.ByteString.Lazy.UTF8     (fromString)
-import           Data.Monoid                   ((<>))
 import           Data.Text
 import           GHC.Generics
 import           Test.Hspec
