diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+# 0.5.1 (2021-09-10)
+
+- Support `aeson-2.0.0.0`
+
 # 0.5 (2021-03-22)
 
 - Trim lower bounds
diff --git a/aeson-extra.cabal b/aeson-extra.cabal
--- a/aeson-extra.cabal
+++ b/aeson-extra.cabal
@@ -1,6 +1,6 @@
 cabal-version:      >=1.10
 name:               aeson-extra
-version:            0.5
+version:            0.5.1
 synopsis:           Extra goodies for aeson
 description:
   Package provides extra functionality on top of @aeson@ and @aeson-compat@
@@ -36,11 +36,11 @@
   hs-source-dirs:   src
   ghc-options:      -Wall
   build-depends:
-      aeson                  >=1.5.4.1  && <1.6
-    , attoparsec             >=0.11.3.4 && <0.14
+      aeson                  >=1.5.4.1  && <1.6 || >=2.0 && <2.1
+    , attoparsec             >=0.11.3.4 && <0.15
     , attoparsec-iso8601     >=1.0      && <1.1
     , base                   >=4.7      && <4.16
-    , base-compat-batteries  >=0.11.2   && <0.12
+    , base-compat-batteries  >=0.11.2   && <0.13
     , bytestring             >=0.10     && <0.12
     , containers             >=0.5      && <0.7
     , deepseq                >=1.3      && <1.5
diff --git a/src/Data/Aeson/Extra/CollapsedList.hs b/src/Data/Aeson/Extra/CollapsedList.hs
--- a/src/Data/Aeson/Extra/CollapsedList.hs
+++ b/src/Data/Aeson/Extra/CollapsedList.hs
@@ -30,10 +30,17 @@
 #endif
 
 import qualified Data.Foldable       as Foldable
-import qualified Data.HashMap.Strict as HM
 import qualified Data.Text           as T
 
+#if MIN_VERSION_aeson(2,0,0)
+import qualified Data.Aeson.Key as Key
+import qualified Data.Aeson.KeyMap as KM
+#else
+import qualified Data.HashMap.Strict as KM
+#endif
 
+
+
 -- | Collapsed list, singleton is represented as the value itself in JSON encoding.
 --
 -- > λ > decode "null" :: Maybe (CollapsedList [Int] Int)
@@ -102,9 +109,14 @@
 -- > λ > decode "{\"value\": [1, 2, 3, 4]}" :: Maybe V
 -- > Just (V [1,2,3,4])
 parseCollapsedList :: (FromJSON a, FromJSON1 f, Alternative f) => Object -> Text -> Parser (f a)
-parseCollapsedList obj key =
-    case HM.lookup key obj of
+parseCollapsedList obj key' =
+    case KM.lookup key obj of
         Nothing   -> pure Control.Applicative.empty
         Just v    -> modifyFailure addKeyName $ (getCollapsedList <$> parseJSON v) -- <?> Key key
   where
-    addKeyName = (mappend ("failed to parse field " `mappend` T.unpack key `mappend`": "))
+#if MIN_VERSION_aeson(2,0,0)
+    key = Key.fromText key'
+#else
+    key = key'
+#endif
+    addKeyName = (mappend ("failed to parse field " `mappend` T.unpack key' `mappend`": "))
diff --git a/src/Data/Aeson/Extra/Recursive.hs b/src/Data/Aeson/Extra/Recursive.hs
--- a/src/Data/Aeson/Extra/Recursive.hs
+++ b/src/Data/Aeson/Extra/Recursive.hs
@@ -45,6 +45,10 @@
 import qualified Data.Functor.Foldable as F
 #endif
 
+#if MIN_VERSION_aeson(2,0,0)
+import qualified Data.Aeson.KeyMap as KM
+#endif
+
 -- | A JSON \"object\" (key\/value map).
 --
 -- /Since: aeson-extra-0.3.1.0/
@@ -70,7 +74,11 @@
 type instance Base Value = ValueF
 
 instance Recursive Value where
+#if MIN_VERSION_aeson(2,0,0)
+    project (Object o) = ObjectF (KM.toHashMapText o)
+#else
     project (Object o) = ObjectF o
+#endif
     project (Array a)  = ArrayF a
     project (String s) = StringF s
     project (Number n) = NumberF n
@@ -78,7 +86,11 @@
     project Null       = NullF
 
 instance Corecursive Value where
+#if MIN_VERSION_aeson(2,0,0)
+    embed (ObjectF o) = Object (KM.fromHashMapText o)
+#else
     embed (ObjectF o) = Object o
+#endif
     embed (ArrayF a)  = Array a
     embed (StringF s) = String s
     embed (NumberF n) = Number n
diff --git a/src/Data/Aeson/Extra/SingObject.hs b/src/Data/Aeson/Extra/SingObject.hs
--- a/src/Data/Aeson/Extra/SingObject.hs
+++ b/src/Data/Aeson/Extra/SingObject.hs
@@ -22,17 +22,26 @@
 import Prelude ()
 import Prelude.Compat
 
-import Control.DeepSeq       (NFData (..))
+import Control.DeepSeq     (NFData (..))
 import Data.Aeson
-import Data.Aeson.Encoding   (pair)
-import Data.Aeson.Internal   (JSONPathElement (Key))
-import Data.Proxy            (Proxy (..))
-import Data.Typeable         (Typeable)
-import GHC.TypeLits          (KnownSymbol, Symbol, symbolVal)
+import Data.Aeson.Encoding (pair)
+import Data.Aeson.Internal (JSONPathElement (Key))
+import Data.Proxy          (Proxy (..))
+import Data.String         (fromString)
+import Data.Typeable       (Typeable)
+import GHC.TypeLits        (KnownSymbol, Symbol, symbolVal)
 
-import qualified Data.HashMap.Strict as HM
-import qualified Data.Text           as T
+import qualified Data.Text as T
 
+#if MIN_VERSION_aeson(2,0,0)
+import qualified Data.Aeson.Key    as Key
+import qualified Data.Aeson.KeyMap as KM
+#else
+import qualified Data.HashMap.Strict as KM
+#endif
+
+
+
 -- | Singleton value object
 --
 -- > λ > decode "{\"value\": 42 }" :: Maybe (SingObject "value" Int)
@@ -53,21 +62,21 @@
 
 instance KnownSymbol s => FromJSON1 (SingObject s) where
     liftParseJSON p _ = withObject ("SingObject "<> show key) $ \obj ->
-        case HM.lookup key obj of
+        case KM.lookup key obj of
             Nothing -> fail $ "key " ++ show key ++ " not present"
             Just v  -> SingObject <$> p v <?> Key key
      where
-        key = T.pack $ symbolVal (Proxy :: Proxy s)
+        key = fromString $ symbolVal (Proxy :: Proxy s)
 
 instance KnownSymbol s => ToJSON1 (SingObject s) where
     liftToJSON     to _ (SingObject x) =
         object [ key .= to x]
       where
-        key = T.pack $ symbolVal (Proxy :: Proxy s)
+        key = fromString $ symbolVal (Proxy :: Proxy s)
     liftToEncoding to _ (SingObject x) =
         pairs $ pair key $ to x
       where
-        key = T.pack $ symbolVal (Proxy :: Proxy s)
+        key = fromString $ symbolVal (Proxy :: Proxy s)
 
 instance  (KnownSymbol s, FromJSON a) => FromJSON (SingObject s a) where
     parseJSON = parseJSON1
