diff --git a/cabal-debian.cabal b/cabal-debian.cabal
--- a/cabal-debian.cabal
+++ b/cabal-debian.cabal
@@ -1,5 +1,5 @@
 Name:           cabal-debian
-Version:        4.38.3
+Version:        4.38.4
 Copyright:      Copyright (c) 2007-2014, David Fox, Jeremy Shaw
 License:        BSD3
 License-File:   LICENSE
@@ -144,7 +144,7 @@
   test-data/artvaluereport2/output/debian/artvaluereport2-backups.install
   test-data/artvaluereport2/output/debian/copyright
   test-data/artvaluereport2/output/debian/source/format
-tested-with: GHC == 7.8.4, GHC == 7.10.3, GHC == 7.11.*
+tested-with: GHC == 8.0.1, GHC == 8.0.2, GHC == 8.4.3, GHC == 8.6.2
 
 flag pretty-112
   Description: prettyclass was merged into pretty-1.1.2
diff --git a/src/Debian/Debianize/Files.hs b/src/Debian/Debianize/Files.hs
--- a/src/Debian/Debianize/Files.hs
+++ b/src/Debian/Debianize/Files.hs
@@ -12,6 +12,7 @@
 import Data.Monoid (mempty)
 #endif
 import Control.Lens
+import Control.Monad.Fail (MonadFail)
 import Control.Monad.Trans (lift)
 import Control.Monad.Writer (execWriterT, tell, WriterT)
 import Data.Char (isSpace)
@@ -49,7 +50,7 @@
 -- the Debianization produced by finalizeDebianization in the unit
 -- tests.)
 
-debianizationFileMap :: (Monad m, Functor m) => DebianT m (Map FilePath Text)
+debianizationFileMap :: (MonadFail m, Functor m) => DebianT m (Map FilePath Text)
 debianizationFileMap =
     fmap (Map.fromListWithKey (\ k a b -> error $ "Multiple values for " ++ k ++ ":\n  " ++ show a ++ "\n" ++ show b)) $ execWriterT $
     do -- here <- liftIO getCurrentDirectory
@@ -144,7 +145,7 @@
     where
       pathf name = "debian" </> show (ppPrint name) ++ ".prerm"
 
-rules :: (Monad m, Functor m) => FilesT m [(FilePath, Text)]
+rules :: (MonadFail m, Functor m) => FilesT m [(FilePath, Text)]
 rules =
     do Just rh <- lift (use (D.rulesHead))
        rassignments <- lift (use (D.rulesSettings)) >>= return . intercalate "\n"
diff --git a/src/Debian/Debianize/Finalize.hs b/src/Debian/Debianize/Finalize.hs
--- a/src/Debian/Debianize/Finalize.hs
+++ b/src/Debian/Debianize/Finalize.hs
@@ -16,6 +16,7 @@
 import Control.Lens hiding ((<.>))
 import Control.Monad (unless, when)
 import Control.Monad as List (mapM_)
+import Control.Monad.Fail (MonadFail)
 import Control.Monad.State (get, modify)
 import Control.Monad.Trans (liftIO, MonadIO)
 import Data.ByteString.Lazy.UTF8 (fromString)
@@ -83,23 +84,23 @@
 -- debian/changelog file) from the current directory, then runs
 -- @customize@ and finalizes the debianization so it is ready to be
 -- output.
-debianize :: (MonadIO m, Functor m) => CabalT m () -> CabalT m ()
+debianize :: (MonadIO m, MonadFail m, Functor m) => CabalT m () -> CabalT m ()
 debianize = debianizeWith (return ())
 
-debianizeWebsite :: (MonadIO m, Functor m) => CabalT m () -> CabalT m ()
+debianizeWebsite :: (MonadIO m, MonadFail m, Functor m) => CabalT m () -> CabalT m ()
 debianizeWebsite = debianizeWith (expandWebsite >> expandServer >> expandBackups)
 
 -- | Pass a function with some additional work to do.  I don't know
 -- if this could be done by just summing it with customize - probably.
 -- But I don't want to untangle this right now.
-debianizeWith :: (MonadIO m, Functor m) => CabalT m () -> CabalT m () -> CabalT m ()
+debianizeWith :: (MonadIO m, MonadFail m, Functor m) => CabalT m () -> CabalT m () -> CabalT m ()
 debianizeWith goodies customize =
   do liftCabal inputChangeLog
      customize
      finalizeDebianization goodies
 
 -- | Do some light IO and call finalizeDebianization.
-finalizeDebianization :: (MonadIO m, Functor m) => CabalT m () -> CabalT m ()
+finalizeDebianization :: (MonadIO m, MonadFail m, Functor m) => CabalT m () -> CabalT m ()
 finalizeDebianization goodies =
     do date <- liftIO getCurrentLocalRFC822Time
        currentUser <- liftIO getCurrentDebianUser
@@ -119,7 +120,7 @@
 -- FIXME: we should be able to run this without a PackageDescription, change
 --        paramter type to Maybe PackageDescription and propagate down thru code
 finalizeDebianization' ::
-    (MonadIO m, Functor m)
+    (MonadIO m, MonadFail m, Functor m)
     => CabalT m ()
     -> String
     -> Maybe NameAddr
@@ -327,7 +328,7 @@
 whenEmpty d [] = d
 whenEmpty _ l = l
 
-finalizeControl :: (Monad m, Functor m) => Maybe NameAddr -> CabalT m ()
+finalizeControl :: (MonadFail m, Functor m) => Maybe NameAddr -> CabalT m ()
 finalizeControl currentUser =
     do finalizeMaintainer currentUser
        Just src <- use (A.debInfo . D.sourcePackageName)
diff --git a/src/Debian/Debianize/Output.hs b/src/Debian/Debianize/Output.hs
--- a/src/Debian/Debianize/Output.hs
+++ b/src/Debian/Debianize/Output.hs
@@ -19,6 +19,7 @@
 
 import Control.Exception as E (throw)
 import Control.Lens
+import Control.Monad.Fail (MonadFail)
 import Control.Monad.State (get, put, StateT)
 import Control.Monad.Trans (liftIO, MonadIO)
 import Data.Algorithm.DiffContext (getContextDiff, prettyContextDiff)
@@ -33,7 +34,7 @@
 import Debian.Debianize.Files (debianizationFileMap)
 import Debian.Debianize.InputDebian (inputDebianization)
 import Debian.Debianize.Goodies (expandWebsite)
-import Debian.Debianize.Monad (DebianT, CabalT, evalDebian, evalCabalT)
+import Debian.Debianize.Monad (DebianT, CabalT, evalDebianT, evalCabalT)
 import Debian.Debianize.Prelude (indent, replaceFile, zipMaps)
 import Debian.Debianize.Finalize (debianizeWith)
 import Debian.Debianize.Optparse
@@ -100,7 +101,7 @@
 
 -- | Depending on the options in @atoms@, either validate, describe,
 -- or write the generated debianization.
-finishDebianization :: forall m. (MonadIO m, Functor m) => StateT CabalInfo m ()
+finishDebianization :: forall m. (MonadIO m, MonadFail m, Functor m) => StateT CabalInfo m ()
 finishDebianization = zoom debInfo $
     do new <- get
        case () of
@@ -126,7 +127,7 @@
 
 
 -- | Write the files of the debianization @d@ to ./debian
-writeDebianization :: (MonadIO m, Functor m) => DebianT m ()
+writeDebianization :: (MonadIO m, MonadFail m, Functor m) => DebianT m ()
 writeDebianization =
     do files <- debianizationFileMap
        liftIO $ mapM_ (uncurry doFile) (Map.toList files)
@@ -138,7 +139,7 @@
 
 -- | Return a string describing the debianization - a list of file
 -- names and their contents in a somewhat human readable format.
-describeDebianization :: (MonadIO m, Functor m) => DebianT m String
+describeDebianization :: (MonadIO m, MonadFail m, Functor m) => DebianT m String
 describeDebianization =
     debianizationFileMap >>= return . concatMap (\ (path, text) -> path ++ ": " ++ indent " > " (unpack text)) . Map.toList
 
@@ -160,8 +161,8 @@
 -- describing the differences.
 compareDebianization :: D.DebInfo -> D.DebInfo -> [String]
 compareDebianization old new =
-    let oldFiles = evalDebian debianizationFileMap (canonical old)
-        newFiles = evalDebian debianizationFileMap (canonical new) in
+    let ~(Just oldFiles) = evalDebianT debianizationFileMap (canonical old)
+        ~(Just newFiles) = evalDebianT debianizationFileMap (canonical new) in
     elems $ zipMaps doFile oldFiles newFiles
     where
       doFile :: FilePath -> Maybe Text -> Maybe Text -> Maybe String
diff --git a/src/Debian/Debianize/Prelude.hs b/src/Debian/Debianize/Prelude.hs
--- a/src/Debian/Debianize/Prelude.hs
+++ b/src/Debian/Debianize/Prelude.hs
@@ -62,7 +62,7 @@
 import Control.Monad.State (get, MonadState, StateT, put)
 import Data.Char (isSpace)
 import Data.List as List (dropWhileEnd, intersperse, isSuffixOf, lines, map)
-import Data.Map as Map (empty, findWithDefault, foldWithKey, fromList, insert, lookup, map, Map)
+import Data.Map as Map (empty, findWithDefault, foldrWithKey, fromList, insert, lookup, map, Map)
 import Data.Maybe (catMaybes, fromJust, fromMaybe, listToMaybe, mapMaybe)
 import Data.Monoid ((<>), mconcat)
 import Data.Set as Set (Set, toList)
@@ -266,7 +266,7 @@
 
 zipMaps :: Ord k => (k -> Maybe a -> Maybe b -> Maybe c) -> Map k a -> Map k b -> Map k c
 zipMaps f m n =
-    foldWithKey h (foldWithKey g Map.empty m) n
+    foldrWithKey h (foldrWithKey g Map.empty m) n
     where
       g k a r = case f k (Just a) (lookup k n) of
                   Just c -> Map.insert k c r              -- Both m and n have entries for k
