diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 ## Upcoming
 
+## 1.0.3
+
+Support GHC 8.8
+
 ## 1.0.2
 
 Bundle test data files in release tarball
diff --git a/aeson-schemas.cabal b/aeson-schemas.cabal
--- a/aeson-schemas.cabal
+++ b/aeson-schemas.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 492943d0169b4a3f5457ebaf335ee3b3630cfbfa520d699dd098450a55875d1a
+-- hash: c2bdf380b742a87fa9d09969246278d74fefaa1c713dc1b131df3e2016de3fa0
 
 name:           aeson-schemas
-version:        1.0.2
+version:        1.0.3
 synopsis:       Easily consume JSON data on-demand with type-safety
 description:    Parse JSON data easily and safely without defining new data types. Useful
                 for deeply nested JSON data, which is difficult to parse using the default
@@ -119,11 +119,13 @@
     , bytestring >=0.10.8.1 && <0.11
     , first-class-families >=0.3.0.0 && <0.6.1
     , megaparsec >=6.0.0 && <7.1
-    , template-haskell >=2.12.0.0 && <2.15
+    , template-haskell >=2.12.0.0 && <2.16
     , text >=1.2.2.2 && <1.3
     , unordered-containers >=0.2.8.0 && <0.3
   if impl(ghc >= 8.0)
-    ghc-options: -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wnoncanonical-monad-instances -Wnoncanonical-monadfail-instances
+    ghc-options: -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wnoncanonical-monad-instances
+  if impl(ghc < 8.8)
+    ghc-options: -Wnoncanonical-monadfail-instances
   default-language: Haskell2010
 
 test-suite aeson-schemas-test
@@ -148,10 +150,12 @@
     , raw-strings-qq >=1.1 && <1.2
     , tasty >=0.11.3 && <1.3
     , tasty-golden >=2.3.1.2 && <2.4
-    , template-haskell >=2.12.0.0 && <2.15
+    , template-haskell >=2.12.0.0 && <2.16
     , text >=1.2.2.2 && <1.3
     , th-test-utils >=1.0.0 && <1.1
     , unordered-containers >=0.2.8.0 && <0.3
   if impl(ghc >= 8.0)
-    ghc-options: -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wnoncanonical-monad-instances -Wnoncanonical-monadfail-instances
+    ghc-options: -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wnoncanonical-monad-instances
+  if impl(ghc < 8.8)
+    ghc-options: -Wnoncanonical-monadfail-instances
   default-language: Haskell2010
diff --git a/src/Data/Aeson/Schema/Internal.hs b/src/Data/Aeson/Schema/Internal.hs
--- a/src/Data/Aeson/Schema/Internal.hs
+++ b/src/Data/Aeson/Schema/Internal.hs
@@ -7,6 +7,7 @@
 Internal definitions for declaring JSON schemas.
 -}
 {-# LANGUAGE AllowAmbiguousTypes #-}
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE ConstraintKinds #-}
 {-# LANGUAGE DataKinds #-}
 {-# LANGUAGE DefaultSignatures #-}
@@ -28,6 +29,9 @@
 module Data.Aeson.Schema.Internal where
 
 import Control.Applicative ((<|>))
+#if !MIN_VERSION_base(4,13,0)
+import Control.Monad.Fail (MonadFail)
+#endif
 import Data.Aeson (FromJSON(..), Value(..))
 import Data.Aeson.Types (Parser)
 import Data.Bifunctor (first)
@@ -190,7 +194,7 @@
       pair = "\"" ++ key ++ "\": " ++ value
 
 -- | A helper for creating fail messages when parsing a schema.
-parseFail :: forall (schema :: SchemaType) m a. (Monad m, Typeable schema) => [Text] -> Value -> m a
+parseFail :: forall (schema :: SchemaType) m a. (MonadFail m, Typeable schema) => [Text] -> Value -> m a
 parseFail path value = fail $ msg ++ ": " ++ ellipses 200 (show value)
   where
     msg = if null path
diff --git a/src/Data/Aeson/Schema/TH/Parse.hs b/src/Data/Aeson/Schema/TH/Parse.hs
--- a/src/Data/Aeson/Schema/TH/Parse.hs
+++ b/src/Data/Aeson/Schema/TH/Parse.hs
@@ -16,6 +16,9 @@
 import Control.Applicative (empty)
 #endif
 import Control.Monad (void)
+#if !MIN_VERSION_base(4,13,0)
+import Control.Monad.Fail (MonadFail)
+#endif
 import Data.Functor (($>))
 import Data.List (intercalate)
 import Data.Void (Void)
@@ -32,7 +35,7 @@
 errorBundlePretty = parseErrorPretty
 #endif
 
-parse :: Monad m => Parser a -> String -> m a
+parse :: MonadFail m => Parser a -> String -> m a
 parse parser s = either (fail . errorBundlePretty) return $ runParser parser s s
 
 {- Parser primitives -}
diff --git a/test/AllTypes.hs b/test/AllTypes.hs
--- a/test/AllTypes.hs
+++ b/test/AllTypes.hs
@@ -2,12 +2,13 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE QuasiQuotes #-}
 {-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeApplications #-}
 
 module AllTypes where
 
 import Data.Aeson (FromJSON(..), withText)
 import Data.Aeson.Schema
-import Data.Aeson.Schema.TH (mkEnum, mkGetter)
+import Data.Aeson.Schema.TH (mkEnum)
 import qualified Data.Text as Text
 
 import Util (getMockedResult)
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -3,6 +3,7 @@
 {-# LANGUAGE FlexibleContexts #-}
 {-# LANGUAGE QuasiQuotes #-}
 {-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeApplications #-}
 {-# LANGUAGE TypeFamilies #-}
 
 import Data.Aeson.Schema (Object, get, unwrap)
