diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,11 @@
 # ChangeLog
 
+## 0.6.0
+
+* Now builds with GHC-8.8. This is a major version bump because
+  MonadFail constraints were added to some functions, which is
+  potentially a breaking change.
+
 ## 0.5.1.2
 
 * Fixes compilation with GHC < 8.0.  See
diff --git a/src/Data/Store/TH.hs b/src/Data/Store/TH.hs
--- a/src/Data/Store/TH.hs
+++ b/src/Data/Store/TH.hs
@@ -37,6 +37,7 @@
     , assertRoundtrip
     ) where
 
+import qualified Control.Monad.Fail as Fail
 import Data.Complex ()
 import Data.Store.Impl
 import Data.Typeable (Typeable, typeOf)
@@ -60,7 +61,7 @@
         expr <- [e| property $ changeDepth (\_ -> depth) $ \x -> checkRoundtrip verbose (x :: $(return ty)) |]
         return ("Roundtrips (" ++ pprint ty ++ ")", expr)
 
-assertRoundtrip :: (Eq a, Show a, Store a, Monad m, Typeable a) => Bool -> a -> m ()
+assertRoundtrip :: (Eq a, Show a, Store a, Fail.MonadFail m, Typeable a) => Bool -> a -> m ()
 assertRoundtrip verbose x
     | checkRoundtrip verbose x = return ()
     | otherwise = fail $ "Failed to roundtrip "  ++ show (typeOf x)
diff --git a/src/Data/Store/TH/Internal.hs b/src/Data/Store/TH/Internal.hs
--- a/src/Data/Store/TH/Internal.hs
+++ b/src/Data/Store/TH/Internal.hs
@@ -363,7 +363,14 @@
     FamilyI _ insts <- reify ''UV.Vector
     return (map (everywhere (id `extT` dequalVarT) . go) insts)
   where
-#if MIN_VERSION_template_haskell(2,11,0)
+#if MIN_VERSION_template_haskell(2,15,0)
+    go (NewtypeInstD preds _ lhs _ con _)
+      | [_, ty] <- unAppsT lhs
+      = (preds, ty, conToDataCons con)
+    go (DataInstD preds _ lhs _ cons _)
+      | [_, ty] <- unAppsT lhs
+      = (preds, ty, concatMap conToDataCons cons)
+#elif MIN_VERSION_template_haskell(2,11,0)
     go (NewtypeInstD preds _ [ty] _ con _) = (preds, ty, conToDataCons con)
     go (DataInstD preds _ [ty] _ cons _) = (preds, ty, concatMap conToDataCons cons)
 #else
diff --git a/src/Data/Store/Version.hs b/src/Data/Store/Version.hs
--- a/src/Data/Store/Version.hs
+++ b/src/Data/Store/Version.hs
@@ -217,7 +217,7 @@
     goField = do
         s <- get
         case sFieldNames s of
-            [] -> fail "impossible case in getStructureInfo'"
+            [] -> error "impossible case in getStructureInfo'"
             (name:names) -> do
                 getStructureInfo' ignore renames (Proxy :: Proxy b)
                 s' <- get
diff --git a/src/System/IO/ByteBuffer.hs b/src/System/IO/ByteBuffer.hs
--- a/src/System/IO/ByteBuffer.hs
+++ b/src/System/IO/ByteBuffer.hs
@@ -43,6 +43,7 @@
 import           Control.Applicative
 import           Control.Exception (SomeException, throwIO)
 import           Control.Exception.Lifted (Exception, bracket, catch)
+import qualified Control.Monad.Fail as Fail
 import           Control.Monad.IO.Class (MonadIO, liftIO)
 import           Control.Monad.Trans.Control (MonadBaseControl)
 import           Data.ByteString (ByteString)
@@ -280,7 +281,7 @@
 -- such the ones created by the @network@ package.
 --
 -- Returns how many bytes could be read non-blockingly.
-fillFromFd :: MonadIO m => ByteBuffer -> Fd -> Int -> m Int
+fillFromFd :: (MonadIO m, Fail.MonadFail m) => ByteBuffer -> Fd -> Int -> m Int
 fillFromFd bb sock maxBytes = if maxBytes < 0
     then fail ("fillFromFd: negative argument (" ++ show maxBytes ++ ")")
     else bbHandler "fillFromFd" bb go
diff --git a/store.cabal b/store.cabal
--- a/store.cabal
+++ b/store.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 432401eddc329fdeadc94cd6a50d7641756074a9537ef2306c874619e22c33af
+-- hash: 29e57f0dc122be22cc4c7ed274c08348beaae45fd10ae85865b065ef85cdefbe
 
 name:           store
-version:        0.5.1.2
+version:        0.6.0
 synopsis:       Fast binary serialization
 category:       Serialization, Data
 homepage:       https://github.com/fpco/store#readme
