diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,9 @@
 # Revision history for cborg
 
+## 0.2.2.1  -- 2019-12-29
+
+* Testsuite updates for GHC 8.8
+
 ## 0.2.2.0  -- 2019-07-31
 
 * Add peekByteOffset for the current ByteOffset in the input byte sequence.
diff --git a/cborg.cabal b/cborg.cabal
--- a/cborg.cabal
+++ b/cborg.cabal
@@ -1,5 +1,5 @@
 name:                cborg
-version:             0.2.2.0
+version:             0.2.2.1
 synopsis:            Concise Binary Object Representation (CBOR)
 license:             BSD3
 license-file:        LICENSE.txt
@@ -98,7 +98,7 @@
       integer-gmp
 
   if impl(ghc >= 8.0)
-    ghc-options: -Wcompat -Wnoncanonical-monad-instances -Wnoncanonical-monadfail-instances
+    ghc-options: -Wcompat -Wnoncanonical-monad-instances
   else
     -- provide/emulate `Control.Monad.Fail` and `Data.Semigroups` API for pre-GHC8
     build-depends: fail == 4.9.*, semigroups >=0.18 && <0.20
@@ -143,7 +143,6 @@
     base64-bytestring       >= 1.0     && < 1.1,
     base16-bytestring       >= 0.1     && < 0.2,
     deepseq                 >= 1.0     && < 1.5,
-    fail                    >= 4.9.0.0 && < 4.10,
     half                    >= 0.2.2.3 && < 0.4,
     QuickCheck              >= 2.9     && < 2.14,
     random,
@@ -152,4 +151,6 @@
     tasty-hunit             >= 0.9     && < 0.11,
     tasty-quickcheck        >= 0.8     && < 0.11,
     vector                  >= 0.10    && < 0.13
-
+  if !impl(ghc >= 8.0)
+    build-depends:
+      fail                    >= 4.9.0.0 && < 4.10
diff --git a/tests/Tests/Reference/Implementation.hs b/tests/Tests/Reference/Implementation.hs
--- a/tests/Tests/Reference/Implementation.hs
+++ b/tests/Tests/Reference/Implementation.hs
@@ -487,7 +487,7 @@
     (MajorType7, AiValue (UInt32    w)) -> return (MT7_Float32 (FloatSpecials (wordToFloat w)))
     (MajorType7, AiValue (UInt64    w)) -> return (MT7_Float64 (DoubleSpecials (wordToDouble w)))
     (MajorType7, AiIndefLen)            -> return (MT7_Break)
-    _                                   -> fail "invalid token header"
+    _                                   -> Left "invalid token header"
 
 
 encodeToken :: Encoder Token
@@ -541,7 +541,7 @@
 lengthUInt = toUInt . fromIntegral . length
 
 decodeUTF8 :: [Word8] -> Either String [Char]
-decodeUTF8 = either (fail . show) (return . T.unpack) . T.decodeUtf8' . BS.pack
+decodeUTF8 = either (Left . show) (return . T.unpack) . T.decodeUtf8' . BS.pack
 
 encodeUTF8 :: [Char] -> [Word8]
 encodeUTF8 = BS.unpack . T.encodeUtf8 . T.pack
diff --git a/tests/Tests/Reference/TestVectors.hs b/tests/Tests/Reference/TestVectors.hs
--- a/tests/Tests/Reference/TestVectors.hs
+++ b/tests/Tests/Reference/TestVectors.hs
@@ -41,7 +41,7 @@
   parseJSON =
     withObject "cbor test" $ \obj -> do
       encoded64 <- T.encodeUtf8 <$> obj .: "cbor"
-      encoded   <- either (fail "invalid base64") return $
+      encoded   <- either fail return $
                    Base64.decode encoded64
       encoded16 <- T.encodeUtf8 <$> obj .: "hex"
       let encoded' = fst (Base16.decode encoded16)
