diff --git a/ginger.cabal b/ginger.cabal
--- a/ginger.cabal
+++ b/ginger.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                ginger
-version:             0.10.2.0
+version:             0.10.4.0
 synopsis:            An implementation of the Jinja2 template language in Haskell
 description:         Ginger is Jinja, minus the most blatant pythonisms. Wants
                      to be feature complete, but isn't quite there yet.
@@ -40,7 +40,7 @@
   -- other-modules:
   -- other-extensions:
   build-depends: base >=4.8 && <5
-               , aeson >=1.4.2.0 && <1.6
+               , aeson >=1.4.2.0 && <2.1
                , aeson-pretty >=0.8.7 && <0.9
                , bytestring >=0.10.8.2 && <0.11
                , containers >=0.6.4 && <0.7
@@ -72,7 +72,7 @@
     default-language:    Haskell2010
     build-depends: base >= 4.8 && <5
                  , ginger
-                 , aeson >=1.4.2.0 && <1.6
+                 , aeson >=1.4.2.0 && <2.1
                  , bytestring >=0.10.8.2 && <0.11
                  , data-default >= 0.5
                  , optparse-applicative >=0.14.3.0 && <0.17
@@ -92,7 +92,7 @@
     default-language: Haskell2010
     build-depends: base >=4.8 && <5
                  , ginger
-                 , aeson >=1.4.2.0 && <1.6
+                 , aeson >=1.4.2.0 && <2.1
                  , bytestring >=0.10.8.2 && <0.11
                  , data-default >=0.5
                  , mtl >=2.2.2 && <2.3
diff --git a/src/Text/Ginger/GVal.hs b/src/Text/Ginger/GVal.hs
--- a/src/Text/Ginger/GVal.hs
+++ b/src/Text/Ginger/GVal.hs
@@ -1,3 +1,4 @@
+{-#LANGUAGE CPP #-}
 {-#LANGUAGE OverloadedStrings #-}
 {-#LANGUAGE MultiParamTypeClasses #-}
 {-#LANGUAGE FlexibleInstances #-}
@@ -59,6 +60,10 @@
 import Data.Fixed (Fixed (..), Pico)
 import Control.Applicative
 import qualified Data.Aeson as JSON
+#if MIN_VERSION_aeson(2,0,0)
+import qualified Data.Aeson.Key as AK
+import qualified Data.Aeson.KeyMap as AKM
+#endif
 import qualified Data.HashMap.Strict as HashMap
 import Data.HashMap.Strict (HashMap)
 import qualified Data.Map.Strict as Map
@@ -658,6 +663,24 @@
 rawJSONToGVal JSON.Null = def
 rawJSONToGVal (JSON.Array a) = toGVal $ Vector.toList a
 rawJSONToGVal (JSON.Object o) = toGVal o
+
+#if MIN_VERSION_aeson(2,0,0)
+-- | 'AKM.KeyMap' of 'JSON.Value' becomes a dictionary-like 'GVal'
+instance ToGVal m (AKM.KeyMap JSON.Value) where
+    toGVal xs = helper (AKM.map toGVal xs)
+        where
+            helper :: AKM.KeyMap (GVal m) -> GVal m
+            helper xs =
+                def
+                    { asHtml = mconcat . List.map (asHtml . snd) . AKM.toList $ xs
+                    , asText = mconcat . List.map (asText . snd) . AKM.toList $ xs
+                    , asBytes = mconcat . List.map (asBytes . snd) . AKM.toList $ xs
+                    , asBoolean = not . AKM.null $ xs
+                    , isNull = False
+                    , asLookup = Just $ (`AKM.lookup` xs) . AK.fromText
+                    , asDictItems = Just . List.map (\(k,v) -> (AK.toText k, v)) . AKM.toList $ xs
+                    }
+#endif
 
 -- | Turn a 'Function' into a 'GVal'
 fromFunction :: Function m -> GVal m
diff --git a/src/Text/PrintfA.hs b/src/Text/PrintfA.hs
--- a/src/Text/PrintfA.hs
+++ b/src/Text/PrintfA.hs
@@ -9,4 +9,4 @@
 data PrintfTypeT = T { unT :: forall r. PrintfType r => r }
 
 printfa :: PrintfType t => String -> [ PrintfArgT ] -> t
-printfa format = unT . foldl (\(T r) (P a) -> T $ r a ) (T $ printf format)
+printfa format = (\(T t) -> t) . foldl (\(T r) (P a) -> T $ r a ) (T $ printf format)
