diff --git a/composite-aeson.cabal b/composite-aeson.cabal
--- a/composite-aeson.cabal
+++ b/composite-aeson.cabal
@@ -4,14 +4,14 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 15940f55e4ff012339686c8d68ef398a5eb7acbcd09b10646b4b1f92cf09604f
+-- hash: 59ac963f7aed0e5fd7aeaa2713a1e203b3a4bbb781bd64c5a774ce152f2a265f
 
 name:           composite-aeson
-version:        0.8.0.0
+version:        0.8.1.0
 synopsis:       JSON for Vinyl records
 description:    Integration between Aeson and Vinyl records allowing records to be easily converted to JSON using automatic derivation, explicit formats, or a mix of both.
 category:       Records
-homepage:       https://github.com/ConferOpenSource/composite#readme
+homepage:       https://github.com/composite-hs/composite#readme
 author:         Confer Health, Inc
 maintainer:     oss@vitalbio.com
 copyright:      2017 Confer Health, Inc., 2020-2021 Vital Biosciences
diff --git a/src/Composite/Aeson/Formats/DateTime.hs b/src/Composite/Aeson/Formats/DateTime.hs
--- a/src/Composite/Aeson/Formats/DateTime.hs
+++ b/src/Composite/Aeson/Formats/DateTime.hs
@@ -93,7 +93,7 @@
   Fail    f <*> _         = Fail    f
 
 instance Monad SuccessOrFail where
-  return = Success
+  return = pure
   Success a >>= k = k a
   Fail    f >>= _ = Fail f
 #if MIN_VERSION_base(4,13,0)
diff --git a/src/Composite/Aeson/Formats/Generic.hs b/src/Composite/Aeson/Formats/Generic.hs
--- a/src/Composite/Aeson/Formats/Generic.hs
+++ b/src/Composite/Aeson/Formats/Generic.hs
@@ -11,8 +11,12 @@
 import Data.Aeson (FromJSON, ToJSON, (.=), toJSON)
 import qualified Data.Aeson as Aeson
 import qualified Data.Aeson.BetterErrors as ABE
+#if MIN_VERSION_aeson(2,0,0)
 import qualified Data.Aeson.Key as Aeson.Key
 import qualified Data.Aeson.KeyMap as Aeson.KeyMap
+#else
+import qualified Data.HashMap.Strict as StrictHashMap
+#endif
 import Data.List.NonEmpty (NonEmpty((:|)))
 import qualified Data.List.NonEmpty as NEL
 import Data.Text (Text, intercalate, unpack)
@@ -49,7 +53,11 @@
 jsonObjectFormat :: (t -> [(Text, a)]) -> ([(Text, a)] -> ABE.Parse e t) -> JsonFormat e a -> JsonFormat e t
 jsonObjectFormat oToList iFromList =
   over _Wrapped $ \ (JsonProfunctor o i) ->
+#if MIN_VERSION_aeson(2,0,0)
     JsonProfunctor (Aeson.Object . Aeson.KeyMap.fromList . map (first Aeson.Key.fromText . second o) . oToList)
+#else
+    JsonProfunctor (Aeson.Object . StrictHashMap.fromList . map (second o) . oToList)
+#endif
                    (ABE.eachInObject i >>= iFromList)
 
 
@@ -192,13 +200,23 @@
 -- |Map a sum type from JSON in the 'SumStyleFieldName' style.
 fieldNameSumFromJson :: NonEmpty (Text, FromJson e a) -> ABE.Parse e a
 fieldNameSumFromJson iAs = do
+#if MIN_VERSION_aeson(2,0,0)
   fields <- ABE.withObject $ pure . Aeson.KeyMap.keys
+#else
+  fields <- ABE.withObject $ pure . StrictHashMap.keys
+#endif
   case fields of
     [f] ->
+#if MIN_VERSION_aeson(2,0,0)
       let ft = Aeson.Key.toText f
       in case lookup ft (NEL.toList iAs) of
         Just (FromJson iA) -> ABE.key ft iA
         Nothing -> throwError $ ABE.InvalidJSON $ "unknown field " <> unpack ft <> ", expected one of " <> expected
+#else
+      case lookup f (NEL.toList iAs) of
+        Just (FromJson iA) -> ABE.key f iA
+        Nothing -> throwError $ ABE.InvalidJSON $ "unknown field " <> unpack f <> ", expected one of " <> expected
+#endif
     [] ->
       throwError $ ABE.InvalidJSON $ "expected an object with one field (" <> expected <> ") not an empty object"
     _ ->
@@ -208,7 +226,11 @@
 
 -- |Map a sum type to JSON in the 'SumStyleFieldName' style.
 fieldNameSumToJson :: (a -> (Text, Aeson.Value)) -> a -> Aeson.Value
+#if MIN_VERSION_aeson(2,0,0)
 fieldNameSumToJson oA = \ (oA -> (t, v)) -> Aeson.object [Aeson.Key.fromText t .= v]
+#else
+fieldNameSumToJson oA = \ (oA -> (t, v)) -> Aeson.object [t .= v]
+#endif
 
 -- |Map a sum type from JSON in the 'SumStyleTypeValue' style.
 typeValueSumFromJson :: Text -> Text -> NonEmpty (Text, FromJson e a) -> ABE.Parse e a
@@ -223,7 +245,11 @@
 
 -- |Map a sum type to JSON in the 'SumStyleTypeValue' style.
 typeValueSumToJson :: Text -> Text -> (a -> (Text, Aeson.Value)) -> a -> Aeson.Value
+#if MIN_VERSION_aeson(2,0,0)
 typeValueSumToJson typeField valueField oA = \ (oA -> (t, v)) -> Aeson.object [Aeson.Key.fromText typeField .= t, Aeson.Key.fromText valueField .= v]
+#else
+typeValueSumToJson typeField valueField oA = \ (oA -> (t, v)) -> Aeson.object [typeField .= t, valueField .= v]
+#endif
 
 -- |Map a sum type from JSON in the 'SumStyleMergeType' style.
 mergeTypeSumFromJson :: Text -> NonEmpty (Text, FromJson e a) -> ABE.Parse e a
@@ -239,11 +265,19 @@
 -- |Map a sum type to JSON in the 'SumStyleMergeType' style.
 mergeTypeSumToJson :: Text -> (a -> (Text, Aeson.Value)) -> a -> Aeson.Value
 mergeTypeSumToJson typeField oA = \ a -> case oA a of
+#if MIN_VERSION_aeson(2,0,0)
   (t, Aeson.Object fields) | Aeson.KeyMap.member (Aeson.Key.fromText typeField) fields ->
+#else
+  (t, Aeson.Object fields) | StrictHashMap.member typeField fields ->
+#endif
     error $ "PRECONDITION VIOLATED: encoding a value with merge type sum style yielded "
          <> "(" <> unpack t <> ", " <> show (Aeson.Object fields) <> ") which already contains the field " <> unpack typeField
   (t, Aeson.Object fields) ->
+#if MIN_VERSION_aeson(2,0,0)
     Aeson.Object (Aeson.KeyMap.insert (Aeson.Key.fromText typeField) (Aeson.String t) fields)
+#else
+    Aeson.Object (StrictHashMap.insert typeField (Aeson.String t) fields)
+#endif
   (t, other) ->
     error $ "PRECONDITION VIOLATED: encoding a value with merge type sum style yielded "
          <> "(" <> unpack t <> ", " <> show other <> ") which isn't an object"
diff --git a/src/Composite/Aeson/Formats/InternalTH.hs b/src/Composite/Aeson/Formats/InternalTH.hs
--- a/src/Composite/Aeson/Formats/InternalTH.hs
+++ b/src/Composite/Aeson/Formats/InternalTH.hs
@@ -6,8 +6,12 @@
 import Composite.Aeson.Base (JsonFormat(JsonFormat), JsonProfunctor(JsonProfunctor))
 import Control.Monad.Except (throwError)
 import qualified Data.Aeson as Aeson
+#if MIN_VERSION_aeson(2,0,0)
 import qualified Data.Aeson.Key as Aeson.Key
 import qualified Data.Aeson.KeyMap as Aeson.KeyMap
+#else
+import qualified Data.HashMap.Lazy as HM
+#endif
 import qualified Data.Aeson.BetterErrors as ABE
 import Data.List (foldl')
 import Data.Text (Text)
@@ -137,8 +141,13 @@
           oTupImpl =
             lamE
               [conP (tupleDataName arity) (map varP valNames)]
+#if MIN_VERSION_aeson(2,0,0)
               [| (Aeson.Object . Aeson.KeyMap.fromList)
                  $(listE $ map (\ (fName, varName, oName) -> [| (Aeson.Key.fromText $(varE fName), $(varE oName) $(varE varName)) |])
+#else
+              [| (Aeson.Object . HM.fromList)
+                 $(listE $ map (\ (fName, varName, oName) -> [| ($(varE fName), $(varE oName) $(varE varName)) |])
+#endif
                                (zip3 fNames valNames oNames)) |]
           iTupImpl =
             doE
diff --git a/src/Composite/Aeson/Record.hs b/src/Composite/Aeson/Record.hs
--- a/src/Composite/Aeson/Record.hs
+++ b/src/Composite/Aeson/Record.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 module Composite.Aeson.Record
   ( ToJsonField(..), FromJsonField(..), JsonField(..)
   , field, field', fromField, fromField', toField, toField'
@@ -20,8 +21,12 @@
 import Control.Monad (join)
 import qualified Data.Aeson as Aeson
 import qualified Data.Aeson.BetterErrors as ABE
+#if MIN_VERSION_aeson(2,0,0)
 import qualified Data.Aeson.Key as Aeson.Key
 import qualified Data.Aeson.KeyMap as Aeson.KeyMap
+#else
+import qualified Data.HashMap.Strict as HM
+#endif
 import Data.Functor.Contravariant (Contravariant, contramap)
 import Data.Functor.Identity (Identity(Identity))
 import Data.Proxy (Proxy(Proxy))
@@ -186,7 +191,11 @@
 
 instance forall s a rs. (KnownSymbol s, RecordToJsonObject rs) => RecordToJsonObject (s :-> a ': rs) where
   recordToJsonObject (ToJsonField aToField :& fs) (Identity a :& as) =
+#if MIN_VERSION_aeson(2,0,0)
     maybe id (Aeson.KeyMap.insert (Aeson.Key.fromString . symbolVal $ (Proxy :: Proxy s))) (aToField a) $
+#else
+    maybe id (HM.insert (pack . symbolVal $ (Proxy :: Proxy s))) (aToField a) $
+#endif
       recordToJsonObject fs as
 
 -- |Given a record of 'ToField' functions for each field in @rs@, convert an 'Identity' record to JSON. Equivalent to @Aeson.Object . 'recordToJsonObject' fmt@
