diff --git a/Codec/Encryption/OpenPGP/Serialize.hs b/Codec/Encryption/OpenPGP/Serialize.hs
--- a/Codec/Encryption/OpenPGP/Serialize.hs
+++ b/Codec/Encryption/OpenPGP/Serialize.hs
@@ -473,7 +473,7 @@
     putWord8 (fromIntegral ((fromIntegral (l - 192) `shiftR` 8) + 192 :: Int)) >>
     putWord8 (fromIntegral (l - 192) .&. 0xff)
   | l <= 0xffffffff = putWord8 255 >> putWord32be (fromIntegral l)
-  | otherwise = fail ("too big (" ++ show l ++ ")")
+  | otherwise = error ("too big (" ++ show l ++ ")")
 
 getSigSubPacketType :: Get (Bool, Word8)
 getSigSubPacketType = do
@@ -556,7 +556,7 @@
     putWord8 (fromIntegral ((fromIntegral (l - 192) `shiftR` 8) + 192 :: Int)) >>
     putWord8 (fromIntegral (l - 192) .&. 0xff)
   | l < 0x100000000 = putWord8 255 >> putWord32be (fromIntegral l)
-  | otherwise = fail "partial body length support needed" -- FIXME
+  | otherwise = error "partial body length support needed" -- FIXME
 
 getS2K :: Get S2K
 getS2K = getS2K' =<< getWord8
diff --git a/Codec/Encryption/OpenPGP/SerializeForSigs.hs b/Codec/Encryption/OpenPGP/SerializeForSigs.hs
--- a/Codec/Encryption/OpenPGP/SerializeForSigs.hs
+++ b/Codec/Encryption/OpenPGP/SerializeForSigs.hs
@@ -1,5 +1,5 @@
 -- SerializeForSigs.hs: OpenPGP (RFC4880) special serialization for signature purposes
--- Copyright © 2012-2016  Clint Adams
+-- Copyright © 2012-2020  Clint Adams
 -- This software is released under the terms of the Expat license.
 -- (See the LICENSE file).
 module Codec.Encryption.OpenPGP.SerializeForSigs
@@ -44,7 +44,7 @@
   putWord16be . fromIntegral $ BL.length bs
   putLazyByteString bs
 putPKPforFingerprinting _ =
-  fail "This should never happen (putPKPforFingerprinting)"
+  error "This should never happen (putPKPforFingerprinting)"
 
 putMPIforFingerprinting :: MPI -> Put
 putMPIforFingerprinting (MPI i) =
@@ -61,7 +61,7 @@
   putWord16be . fromIntegral . BL.length $ hb
   putLazyByteString hb
 putPartialSigforSigning _ =
-  fail "This should never happen (putPartialSigforSigning)"
+  error "This should never happen (putPartialSigforSigning)"
 
 putSigTrailer :: Pkt -> Put
 putSigTrailer (SignaturePkt (SigV4 _ _ _ hs _ _ _)) = do
@@ -69,12 +69,12 @@
   putWord8 0xff
   putWord32be . fromIntegral . (+ 6) . BL.length $ runPut $ mapM_ put hs
             -- this +6 seems like a bug in RFC4880
-putSigTrailer _ = fail "This should never happen (putSigTrailer)"
+putSigTrailer _ = error "This should never happen (putSigTrailer)"
 
 putUforSigning :: Pkt -> Put
 putUforSigning u@(UserIdPkt _) = putUIDforSigning u
 putUforSigning u@(UserAttributePkt _) = putUAtforSigning u
-putUforSigning _ = fail "This should never happen (putUforSigning)"
+putUforSigning _ = error "This should never happen (putUforSigning)"
 
 putUIDforSigning :: Pkt -> Put
 putUIDforSigning (UserIdPkt u) = do
@@ -82,7 +82,7 @@
   let bs = encodeUtf8 u
   putWord32be . fromIntegral . B.length $ bs
   putByteString bs
-putUIDforSigning _ = fail "This should never happen (putUIDforSigning)"
+putUIDforSigning _ = error "This should never happen (putUIDforSigning)"
 
 putUAtforSigning :: Pkt -> Put
 putUAtforSigning (UserAttributePkt us) = do
@@ -90,7 +90,7 @@
   let bs = runPut (mapM_ put us)
   putWord32be . fromIntegral . BL.length $ bs
   putLazyByteString bs
-putUAtforSigning _ = fail "This should never happen (putUAtforSigning)"
+putUAtforSigning _ = error "This should never happen (putUAtforSigning)"
 
 putSigforSigning :: Pkt -> Put
 putSigforSigning (SignaturePkt (SigV4 st pka ha hashed _ left16 mpis)) = do
@@ -98,7 +98,7 @@
   let bs = runPut $ put (SigV4 st pka ha hashed [] left16 mpis)
   putWord32be . fromIntegral . BL.length $ bs
   putLazyByteString bs
-putSigforSigning _ = fail "Non-V4 not implemented."
+putSigforSigning _ = error "Non-V4 not implemented."
 
 putKeyforSigning :: Pkt -> Put
 putKeyforSigning (PublicKeyPkt pkp) = putKeyForSigning' pkp
@@ -106,7 +106,7 @@
 putKeyforSigning (SecretKeyPkt pkp _) = putKeyForSigning' pkp
 putKeyforSigning (SecretSubkeyPkt pkp _) = putKeyForSigning' pkp
 putKeyforSigning x =
-  fail
+  error
     ("This should never happen (putKeyforSigning) " ++
      show (pktTag x) ++ "/" ++ show x)
 
diff --git a/Data/Conduit/OpenPGP/Decrypt.hs b/Data/Conduit/OpenPGP/Decrypt.hs
--- a/Data/Conduit/OpenPGP/Decrypt.hs
+++ b/Data/Conduit/OpenPGP/Decrypt.hs
@@ -1,5 +1,5 @@
 -- Decrypt.hs: OpenPGP (RFC4880) recursive packet decryption
--- Copyright © 2013-2019  Clint Adams
+-- Copyright © 2013-2020  Clint Adams
 -- This software is released under the terms of the Expat license.
 -- (See the LICENSE file).
 {-# LANGUAGE FlexibleContexts #-}
@@ -9,6 +9,7 @@
   ) where
 
 import Control.Monad (when)
+import Control.Monad.Fail (MonadFail)
 import Control.Monad.IO.Class (MonadIO(..))
 import Control.Monad.IO.Unlift (MonadUnliftIO)
 import Control.Monad.Trans.Resource (MonadResource, MonadThrow)
@@ -47,20 +48,20 @@
 type InputCallback m = String -> m BL.ByteString
 
 conduitDecrypt ::
-     (MonadUnliftIO m, MonadResource m, MonadThrow m)
+     (MonadFail m, MonadUnliftIO m, MonadResource m, MonadThrow m)
   => InputCallback IO
   -> ConduitT Pkt Pkt m ()
 conduitDecrypt = conduitDecrypt' def
 
 conduitDecrypt' ::
-     (MonadUnliftIO m, MonadResource m, MonadThrow m)
+     (MonadFail m, MonadUnliftIO m, MonadResource m, MonadThrow m)
   => RecursorState
   -> InputCallback IO
   -> ConduitT Pkt Pkt m ()
 conduitDecrypt' rs cb = CC.concatMapAccumM push rs
   where
     push ::
-         (MonadUnliftIO m, MonadResource m, MonadThrow m)
+         (MonadFail m, MonadUnliftIO m, MonadResource m, MonadThrow m)
       => Pkt
       -> RecursorState
       -> m (RecursorState, [Pkt])
@@ -90,7 +91,7 @@
           p -> return (s, [p])
 
 decryptSEDP ::
-     (MonadUnliftIO m, MonadIO m, MonadThrow m)
+     (MonadFail m, MonadUnliftIO m, MonadIO m, MonadThrow m)
   => RecursorState
   -> InputCallback IO
   -> SKESK
@@ -114,7 +115,7 @@
     CL.consume
 
 decryptSEIPDP ::
-     (MonadUnliftIO m, MonadIO m, MonadThrow m)
+     (MonadFail m, MonadUnliftIO m, MonadIO m, MonadThrow m)
   => RecursorState
   -> InputCallback IO
   -> SKESK
diff --git a/hOpenPGP.cabal b/hOpenPGP.cabal
--- a/hOpenPGP.cabal
+++ b/hOpenPGP.cabal
@@ -1,5 +1,5 @@
 Name:                hOpenPGP
-Version:             2.9.1
+Version:             2.9.2
 Synopsis:            native Haskell implementation of OpenPGP (RFC4880)
 Description:         native Haskell implementation of OpenPGP (RFC4880), plus Camellia (RFC5581), plus ECC (RFC6637)
 Homepage:            https://salsa.debian.org/clint/hOpenPGP
@@ -343,4 +343,4 @@
 source-repository this
   type:     git
   location: https://salsa.debian.org/clint/hOpenPGP.git
-  tag:      v2.9.1
+  tag:      v2.9.2
