diff --git a/src/YamlParse/Applicative/Class.hs b/src/YamlParse/Applicative/Class.hs
--- a/src/YamlParse/Applicative/Class.hs
+++ b/src/YamlParse/Applicative/Class.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE DeriveGeneric #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE GADTs #-}
@@ -7,7 +8,9 @@
 module YamlParse.Applicative.Class where
 
 import qualified Data.Aeson as JSON
-import Data.HashMap.Strict (HashMap)
+#if MIN_VERSION_aeson(2,0,0)
+import Data.Aeson.KeyMap (KeyMap)
+#endif
 import Data.Int
 import Data.List.NonEmpty as NE
 import Data.Map (Map)
@@ -151,7 +154,7 @@
 -- | There is no instance using YamlKeySchema k yet.
 -- Ideally there wouldn't be one for HashMap Text either because it's insecure,
 -- but the yaml arrives in a HashMap anyway so we might as well expose this.
-instance YamlSchema v => YamlSchema (HashMap Text v) where
+instance YamlSchema v => YamlSchema (KeyMap v) where
   yamlSchema = ParseObject Nothing $ ParseMap yamlSchema
 
 -- | A parser for a required field in an object at a given key
diff --git a/src/YamlParse/Applicative/Implement.hs b/src/YamlParse/Applicative/Implement.hs
--- a/src/YamlParse/Applicative/Implement.hs
+++ b/src/YamlParse/Applicative/Implement.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE LambdaCase #-}
@@ -9,12 +10,31 @@
 
 import Control.Applicative
 import qualified Data.Aeson.Types as Aeson
+#if MIN_VERSION_aeson(2,0,0)
+import qualified Data.Aeson.KeyMap as HM
+import qualified Data.Aeson.Key as K
+#else
 import qualified Data.HashMap.Strict as HM
+#endif
 import qualified Data.Map as M
 import qualified Data.Text as T
 import qualified Data.Yaml as Yaml
 import YamlParse.Applicative.Parser
 
+#if MIN_VERSION_aeson(2,0,0)
+fromText :: T.Text -> K.Key
+fromText = K.fromText
+
+toText :: K.Key -> T.Text
+toText = K.toText
+#else
+fromText :: T.Text -> T.Text
+fromText = id
+
+toText :: T.Text -> T.Text
+toText = id
+#endif
+
 -- | Use a 'Parser' to parse a value from Yaml.
 --
 -- A 'Parser i o' corresponds exactly to a 'i -> Yaml.Parser o' and this function servers as evidence for that.
@@ -65,21 +85,21 @@
       ParseField key fp -> \o -> case fp of
         FieldParserFmap f fp' -> f <$> go (ParseField key fp') o
         FieldParserRequired p -> do
-          v <- o Yaml..: key
+          v <- o Yaml..: fromText key
           go p v
         FieldParserOptional p -> do
-          case HM.lookup key o of
+          case HM.lookup (fromText key) o of
             Nothing -> pure Nothing
             Just v -> Just <$> go p v
         FieldParserOptionalWithDefault p d -> do
-          case HM.lookup key o of
+          case HM.lookup (fromText key) o of
             Nothing -> pure d
             Just v -> go p v
       ParseList p -> mapM (go p)
       ParseMap p -> HM.traverseWithKey $ \_ v -> go p v
       ParseMapKeys p pm -> \val -> do
         hm <- go pm val
-        M.fromList <$> mapM (\(k, v) -> (,) <$> go p k <*> pure v) (HM.toList hm)
+        M.fromList <$> mapM (\(k, v) -> (,) <$> go p (toText k) <*> pure v) (HM.toList hm)
       ParsePure v -> const $ pure v
       ParseAp pf p -> \v -> go pf v <*> go p v
       ParseAlt ps -> \v -> case ps of
diff --git a/src/YamlParse/Applicative/Parser.hs b/src/YamlParse/Applicative/Parser.hs
--- a/src/YamlParse/Applicative/Parser.hs
+++ b/src/YamlParse/Applicative/Parser.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE GADTs #-}
 {-# LANGUAGE RankNTypes #-}
@@ -9,7 +10,11 @@
 import Control.Monad
 import qualified Data.Aeson as JSON
 import qualified Data.ByteString.Lazy as LB
-import Data.HashMap.Strict (HashMap)
+#if MIN_VERSION_aeson(2,0,0)
+import Data.Aeson.KeyMap (KeyMap)
+#else
+import qualified Data.HashMap.Strict as HM
+#endif
 import Data.Map (Map)
 import Data.Scientific
 import Data.Text (Text)
@@ -20,6 +25,10 @@
 import qualified Data.Yaml as Yaml
 import Text.Read
 
+#if !MIN_VERSION_aeson(2,0,0)
+type KeyMap a = HM.HashMap T.Text a
+#endif
+
 -- | A parser that takes values of type 'i' as input and parses them into values of type 'o'
 --
 -- Note that there is no 'Monad' instance.
@@ -77,13 +86,13 @@
   -- | Parse a map where the keys are the yaml keys
   ParseMap ::
     Parser Yaml.Value v ->
-    Parser Yaml.Object (HashMap Text v)
+    Parser Yaml.Object (KeyMap v)
   -- | Parse a map's keys via a given parser
   ParseMapKeys ::
     Ord k =>
     Parser Text k ->
-    Parser Yaml.Object (HashMap Text v) ->
-    Parser Yaml.Object (Map k v) -- Once we get out of a HashMap, we'll want to stay out.
+    Parser Yaml.Object (KeyMap v) ->
+    Parser Yaml.Object (Map k v) -- Once we get out of a KeyMap, we'll want to stay out.
 
   -- | Parse a field of an object
   ParseField ::
diff --git a/yamlparse-applicative.cabal b/yamlparse-applicative.cabal
--- a/yamlparse-applicative.cabal
+++ b/yamlparse-applicative.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           yamlparse-applicative
-version:        0.2.0.0
+version:        0.2.0.1
 synopsis:       Declaritive configuration parsing with free docs
 description:    See https://github.com/NorfairKing/yamlparse-applicative
 homepage:       https://github.com/NorfairKing/yamlparse-applicative#readme
