diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,5 @@
+# Revision history for urlencoded
+
+## 0.5.0.0 -- 2021-07-11
+
+* Switch from MonadError to MonadFail
diff --git a/src/Data/URLEncoded.hs b/src/Data/URLEncoded.hs
--- a/src/Data/URLEncoded.hs
+++ b/src/Data/URLEncoded.hs
@@ -41,11 +41,6 @@
 import Data.List.Split ( splitOn )
 import Control.Monad ( liftM )
 import Control.Arrow ( (>>>) )
-#if MIN_VERSION_base(4,8,0)
-import Control.Monad.Except ( MonadError )
-#else
-import Control.Monad.Error ( MonadError )
-#endif
 import Network.URI ( unEscapeString, escapeURIString, isUnreserved, URI(uriQuery) )
 import Data.Monoid ( Monoid, mappend )
 #if MIN_VERSION_base(4,9,0)
@@ -177,7 +172,8 @@
     showsPrec _ q = (export q ++)
 
 -- |Parse this string as x-www-urlencoded
-importString :: MonadError e m => String -> m URLEncoded
+-- @since 0.5.0.0
+importString :: MonadFail m => String -> m URLEncoded
 importString "" = return empty
 importString s = liftM importList $ mapM parsePair $ splitOn "&" s
     where parsePair p =
@@ -189,7 +185,8 @@
                 unknown -> error $ "impossible: " ++ show unknown
           unesc = unEscapeString . intercalate "%20" . splitOn "+"
 
-importURI :: MonadError e m => URI -> m URLEncoded
+-- | @since 0.5.0.0
+importURI :: MonadFail m => URI -> m URLEncoded
 importURI u = case uriQuery u of
                 ('?':s) -> importString s
                 [] -> return empty
@@ -197,7 +194,8 @@
 
 -- |Return the /first/ value for the given key, or throw an error if the
 -- key is not present in the URLEncoded data.
-lookup1 :: (URLShow a, MonadError e m) => a -> URLEncoded -> m String
+-- @since 0.5.0.0
+lookup1 :: (URLShow a, MonadFail m) => a -> URLEncoded -> m String
 lookup1 k = lookup k >>> maybe missing return
     where missing = fail $ "Key not found: " ++ urlShow k
 
diff --git a/test/TestDriver.hs b/test/TestDriver.hs
--- a/test/TestDriver.hs
+++ b/test/TestDriver.hs
@@ -77,11 +77,11 @@
 main :: IO ()
 main = mapM_ quickCheck
        [ property $ \u ->
-             importString (export u) == (Right u :: Either String URLEncoded)
+             importString (export u) == (Just u :: Maybe URLEncoded)
 
        , property $ \u ->
            let s = export u
-               expected = Right s :: Either String String
+               expected = Just s
            in (export `liftM` importString s) == expected
 
        , property $ \u1 u2 ->
@@ -122,7 +122,5 @@
        , forAll (multiLists "repeated") $ \(_, u) ->
            length (lookupAll "repeated" u) > 0
 
-       , property $ \u -> case lookup1 (badKey u) u :: Either String String of
-                            Left _ -> True
-                            Right _ -> False
+       , property $ \u -> lookup1 (badKey u) u == Nothing
        ]
diff --git a/urlencoded.cabal b/urlencoded.cabal
--- a/urlencoded.cabal
+++ b/urlencoded.cabal
@@ -1,6 +1,6 @@
 name:                urlencoded
-Cabal-Version:       >= 1.8
-version:             0.4.2.0
+Cabal-Version:       1.18
+version:             0.5.0.0
 synopsis:            Generate or process x-www-urlencoded data
 
 description:         Generate or process x-www-urlencoded data as it
@@ -13,8 +13,12 @@
 license:             BSD3
 license-file:        LICENSE
 author:              Josh Hoyt, Philip Weaver
-maintainer:          francygazz@gmail.com
+maintainer:          Francesco Gazzetta <fgaz@fgaz.me>
 build-type:          Simple
+extra-doc-files:     CHANGELOG.md
+tested-with:         GHC==9.0.1
+                   , GHC==8.10.4
+                   , GHC==8.8.4
 
 source-repository head
   type:     git
@@ -25,7 +29,7 @@
   default: True
 
 Library
-  build-depends:       base >= 4.7 && <4.12
+  build-depends:       base >= 4.13 && <4.16
                      , mtl >= 1.1 && <2.3
                      , split == 0.2.*
   if flag(network-uri)
@@ -37,11 +41,12 @@
   ghc-options:         -Wall
   hs-source-dirs:      src
   exposed-modules:     Data.URLEncoded
+  default-language:    Haskell2010
 
 Test-suite test
   type: exitcode-stdio-1.0
   build-depends: base
-               , QuickCheck >= 2.11 && < 2.12
+               , QuickCheck >= 2.11 && < 2.15
                , urlencoded
   if flag(network-uri)
     build-depends: network-uri >= 2.6
@@ -53,4 +58,5 @@
   GHC-Options: -Wall
   Main-is: TestDriver.hs
   HS-Source-Dirs: test
+  default-language:    Haskell2010
 
