diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## microstache 1.0.3
+
+- Support GHC-8.6.5...GHC-9.10.1
+
 ## microstache 1.0.2.3
 
 - Support `parsec-3.1.16.*`
diff --git a/microstache.cabal b/microstache.cabal
--- a/microstache.cabal
+++ b/microstache.cabal
@@ -1,7 +1,7 @@
+cabal-version:      2.2
 name:               microstache
-version:            1.0.2.3
-cabal-version:      >=1.10
-license:            BSD3
+version:            1.0.3
+license:            BSD-3-Clause
 license-file:       LICENSE
 author:
   Mark Karpov <markkarpov@openmailbox.org>, Oleg Grenrus <oleg.grenrus@iki.fi>
@@ -29,19 +29,15 @@
   specification/sections.json
 
 tested-with:
-  GHC ==7.4.2
-   || ==7.6.3
-   || ==7.8.4
-   || ==7.10.3
-   || ==8.0.2
-   || ==8.2.2
-   || ==8.4.4
-   || ==8.6.5
+  GHC ==8.6.5
    || ==8.8.4
    || ==8.10.7
    || ==9.0.2
-   || ==9.2.4
-   || ==9.4.1
+   || ==9.2.8
+   || ==9.4.8
+   || ==9.6.5
+   || ==9.8.2
+   || ==9.10.1
 
 source-repository head
   type:     git
@@ -49,23 +45,17 @@
 
 library
   build-depends:
-      aeson                 >=0.11    && <1.6 || >=2.0.0.0 && <2.2
-    , base                  >=4.5     && <4.18
-    , containers            >=0.4.2.1 && <0.7
-    , deepseq               >=1.3.0.0 && <1.5
-    , directory             >=1.1.0.2 && <1.4
-    , filepath              >=1.3.0.0 && <1.5
-    , parsec                >=3.1.11  && <3.2
-    , text                  >=1.2.3.0 && <1.3 || >=2.0 && <2.1
-    , transformers          >=0.3.0.0 && <0.7
-    , unordered-containers  >=0.2.5   && <0.3
-    , vector                >=0.11    && <0.14
-
-  if impl(ghc <=7.6)
-    build-depends: ghc-prim
-
-  if !impl(ghc >=8.0)
-    build-depends: semigroups >=0.18 && <0.21
+      aeson                 >=2.2.2.0  && <2.3
+    , base                  >=4.12.0.0 && <4.21
+    , containers            >=0.6.0.1  && <0.8
+    , deepseq               >=1.4.4.0  && <1.6
+    , directory             >=1.3.3.0  && <1.4
+    , filepath              >=1.4.2.1  && <1.6
+    , parsec                >=3.1.13.0 && <3.2
+    , text                  >=1.2.3.0  && <1.3  || >=2.0 && <2.2
+    , transformers          >=0.5.6.2  && <0.7
+    , unordered-containers  >=0.2.20   && <0.3
+    , vector                >=0.13.1.0 && <0.14
 
   exposed-modules:
     Text.Microstache
@@ -92,8 +82,8 @@
 
   -- tasty-as-hspec
   build-depends:
-      base-orphans  >=0.8.7    && <0.9
-    , tasty         >=1.4.0.1  && <1.5
+      base-orphans  >=0.8.7    && <0.10
+    , tasty         >=1.4.0.1  && <1.6
     , tasty-hunit   >=0.10.0.3 && <0.11
 
   if !impl(ghc >=8.0)
@@ -122,8 +112,8 @@
 
   -- tasty-as-hspec
   build-depends:
-      base-orphans  >=0.8.7    && <0.9
-    , tasty         >=1.4.0.1  && <1.5
+      base-orphans  >=0.8.7    && <0.10
+    , tasty         >=1.4.0.1  && <1.6
     , tasty-hunit   >=0.10.0.3 && <0.11
 
   other-modules:    Test.Hspec
diff --git a/src/Text/Microstache/Compile.hs b/src/Text/Microstache/Compile.hs
--- a/src/Text/Microstache/Compile.hs
+++ b/src/Text/Microstache/Compile.hs
@@ -11,8 +11,6 @@
 -- usually need to import the module, because "Text.Microstache" re-exports
 -- everything you may need, import that module instead.
 
-{-# LANGUAGE CPP #-}
-
 module Text.Microstache.Compile
   ( compileMustacheDir
   , getMustacheFilesInDir
@@ -31,10 +29,6 @@
 import qualified Data.Text         as T
 import qualified Data.Text.Lazy.IO as LT
 import qualified System.FilePath   as F
-
-#if !MIN_VERSION_base(4,8,0)
-import Control.Applicative ((<$>))
-#endif
 
 import Text.Microstache.Parser
 import Text.Microstache.Type
diff --git a/src/Text/Microstache/Parser.hs b/src/Text/Microstache/Parser.hs
--- a/src/Text/Microstache/Parser.hs
+++ b/src/Text/Microstache/Parser.hs
@@ -11,7 +11,6 @@
 -- import the module, because "Text.Microstache" re-exports everything you may
 -- need, import that module instead.
 
-{-# LANGUAGE CPP #-}
 module Text.Microstache.Parser
   ( parseMustache )
 where
@@ -34,10 +33,6 @@
 import Text.Microstache.Type
 
 import qualified Data.Text as T
-
-#if !MIN_VERSION_base(4,8,0)
-import Control.Applicative (Applicative (..))
-#endif
 
 ----------------------------------------------------------------------------
 -- Parser
diff --git a/src/Text/Microstache/Render.hs b/src/Text/Microstache/Render.hs
--- a/src/Text/Microstache/Render.hs
+++ b/src/Text/Microstache/Render.hs
@@ -11,7 +11,6 @@
 -- import the module, because "Text.Microstache" re-exports everything you may
 -- need, import that module instead.
 
-{-# LANGUAGE CPP               #-}
 {-# LANGUAGE OverloadedStrings #-}
 module Text.Microstache.Render
   ( renderMustache, renderMustacheW )
@@ -37,32 +36,13 @@
 import qualified Data.Text.Lazy.Encoding as LTE
 import qualified Data.Vector             as V
 
-#if MIN_VERSION_aeson(2,0,0)
 import qualified Data.Aeson.KeyMap as KM
 import qualified Data.Aeson.Key as Key
-#else
-import qualified Data.HashMap.Strict as KM
-#endif
 
-#if MIN_VERSION_transformers(0,4,0)
 import Control.Monad.Trans.State.Strict (State, execState, modify')
-#else
-import Control.Monad.Trans.State.Strict (State, execState, get, put)
-#endif
 
-#if !MIN_VERSION_base(4,8,0)
-import Control.Applicative ((<$>))
-#endif
-
 import Text.Microstache.Type
 
-#if !(MIN_VERSION_transformers(0,4,0))
-modify' :: (s -> s) -> State s ()
-modify' f = do
-    s <- get
-    put $! f s
-#endif
-
 ----------------------------------------------------------------------------
 -- The rendering monad
 
@@ -242,11 +222,7 @@
   -> Maybe Value       -- ^ Looked-up value
 simpleLookup _ (Key [])     obj        = return obj
 simpleLookup c (Key (k:ks)) (Object m) =
-#if MIN_VERSION_aeson(2,0,0)
   case KM.lookup (Key.fromText k) m of
-#else
-  case KM.lookup k m of
-#endif
     Nothing -> if c then Just Null else Nothing
     Just  v -> simpleLookup True (Key ks) v
 simpleLookup _ _ _ = Nothing
diff --git a/src/Text/Microstache/Type.hs b/src/Text/Microstache/Type.hs
--- a/src/Text/Microstache/Type.hs
+++ b/src/Text/Microstache/Type.hs
@@ -11,7 +11,6 @@
 -- because "Text.Microstache" re-exports everything you may need, import that
 -- module instead.
 
-{-# LANGUAGE CPP                        #-}
 {-# LANGUAGE DeriveDataTypeable         #-}
 {-# LANGUAGE DeriveGeneric              #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
@@ -131,9 +130,7 @@
     "\", key: " ++ T.unpack (showKey key)
 
 instance Exception MustacheException where
-#if MIN_VERSION_base(4,8,0)
     displayException = displayMustacheException
-#endif
 
 -- | @since 1.0.1
 data MustacheWarning
@@ -151,6 +148,4 @@
     "Complex value rendered as such, key: " ++ T.unpack (showKey key)
 
 instance Exception MustacheWarning where
-#if MIN_VERSION_base(4,8,0)
     displayException = displayMustacheWarning
-#endif
diff --git a/tests/Text/Microstache/ParserSpec.hs b/tests/Text/Microstache/ParserSpec.hs
--- a/tests/Text/Microstache/ParserSpec.hs
+++ b/tests/Text/Microstache/ParserSpec.hs
@@ -1,4 +1,3 @@
-{-# LANGUAGE CPP               #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Text.Microstache.ParserSpec
@@ -14,10 +13,6 @@
 import Text.Microstache.Type
 import qualified Data.List.NonEmpty as NE
 import qualified Data.Set           as S
-
-#if !MIN_VERSION_base(4,8,0)
-import Control.Applicative (pure)
-#endif
 
 main :: IO ()
 main = hspec spec
diff --git a/tests/Text/Microstache/RenderSpec.hs b/tests/Text/Microstache/RenderSpec.hs
--- a/tests/Text/Microstache/RenderSpec.hs
+++ b/tests/Text/Microstache/RenderSpec.hs
@@ -1,4 +1,3 @@
-{-# LANGUAGE CPP               #-}
 {-# LANGUAGE OverloadedStrings #-}
 
 module Text.Microstache.RenderSpec
@@ -14,10 +13,6 @@
 import Text.Microstache.Render
 import Text.Microstache.Type
 import qualified Data.Map as M
-
-#if !MIN_VERSION_base(4,8,0)
-import Control.Applicative (pure)
-#endif
 
 main :: IO ()
 main = hspec spec
