diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,11 @@
 See also http://pvp.haskell.org/faq
 
+0.6.2.1
+-------
+
+* Allow GHC-9.0 (base-4.15) (#265)
+* Fix running `cabal repl hackage-security` (#263)
+
 0.6.2.0
 -------
 
diff --git a/hackage-security.cabal b/hackage-security.cabal
--- a/hackage-security.cabal
+++ b/hackage-security.cabal
@@ -1,6 +1,6 @@
 cabal-version:       1.12
 name:                hackage-security
-version:             0.6.2.0
+version:             0.6.2.1
 
 synopsis:            Hackage security library
 description:         The hackage security library provides both server and
@@ -113,9 +113,9 @@
                        Hackage.Security.Util.Lens
                        Hackage.Security.Util.Stack
                        Hackage.Security.Util.TypedEmbedded
-                       Prelude
+                       MyPrelude
   -- We support ghc 7.4 (bundled with Cabal 1.14) and up
-  build-depends:       base              >= 4.5     && < 4.17,
+  build-depends:       base              >= 4.5     && < 4.16,
                        base16-bytestring >= 0.1.1   && < 1.1,
                        base64-bytestring >= 1.0     && < 1.3,
                        bytestring        >= 0.9     && < 0.12,
@@ -171,6 +171,7 @@
                        KindSignatures
                        MultiParamTypeClasses
                        NamedFieldPuns
+                       NoImplicitPrelude
                        NoMonomorphismRestriction
                        RankNTypes
                        RecordWildCards
diff --git a/src/Hackage/Security/Client.hs b/src/Hackage/Security/Client.hs
--- a/src/Hackage/Security/Client.hs
+++ b/src/Hackage/Security/Client.hs
@@ -41,7 +41,7 @@
   , LocalFileCorrupted(..)
   ) where
 
-import Prelude hiding (log)
+import MyPrelude hiding (log)
 import Control.Arrow (first)
 import Control.Exception
 import Control.Monad
diff --git a/src/Hackage/Security/Client/Formats.hs b/src/Hackage/Security/Client/Formats.hs
--- a/src/Hackage/Security/Client/Formats.hs
+++ b/src/Hackage/Security/Client/Formats.hs
@@ -17,6 +17,7 @@
   , formatsLookup
   ) where
 
+import MyPrelude
 import Hackage.Security.Util.Stack
 import Hackage.Security.Util.TypedEmbedded
 
diff --git a/src/Hackage/Security/Client/Repository.hs b/src/Hackage/Security/Client/Repository.hs
--- a/src/Hackage/Security/Client/Repository.hs
+++ b/src/Hackage/Security/Client/Repository.hs
@@ -30,6 +30,7 @@
   , mustCache
   ) where
 
+import MyPrelude
 import Control.Exception
 import Data.Typeable (Typeable)
 import qualified Codec.Archive.Tar.Index as Tar
diff --git a/src/Hackage/Security/Client/Repository/Cache.hs b/src/Hackage/Security/Client/Repository/Cache.hs
--- a/src/Hackage/Security/Client/Repository/Cache.hs
+++ b/src/Hackage/Security/Client/Repository/Cache.hs
@@ -15,6 +15,7 @@
   , lockCacheWithLogger
   ) where
 
+import MyPrelude
 import Control.Exception
 import Control.Monad
 import Control.Monad.IO.Class
diff --git a/src/Hackage/Security/Client/Repository/HttpLib.hs b/src/Hackage/Security/Client/Repository/HttpLib.hs
--- a/src/Hackage/Security/Client/Repository/HttpLib.hs
+++ b/src/Hackage/Security/Client/Repository/HttpLib.hs
@@ -11,6 +11,7 @@
   , bodyReaderFromBS
   ) where
 
+import MyPrelude
 import Data.IORef
 import Network.URI hiding (uriPath, path)
 import qualified Data.ByteString      as BS
diff --git a/src/Hackage/Security/Client/Repository/Local.hs b/src/Hackage/Security/Client/Repository/Local.hs
--- a/src/Hackage/Security/Client/Repository/Local.hs
+++ b/src/Hackage/Security/Client/Repository/Local.hs
@@ -5,6 +5,7 @@
   , withRepository
   ) where
 
+import MyPrelude
 import Hackage.Security.Client.Formats
 import Hackage.Security.Client.Repository
 import Hackage.Security.Client.Repository.Cache
diff --git a/src/Hackage/Security/Client/Repository/Remote.hs b/src/Hackage/Security/Client/Repository/Remote.hs
--- a/src/Hackage/Security/Client/Repository/Remote.hs
+++ b/src/Hackage/Security/Client/Repository/Remote.hs
@@ -27,6 +27,7 @@
   , fileSizeWithinBounds
   ) where
 
+import MyPrelude
 import Control.Concurrent
 import Control.Exception
 import Control.Monad.Cont
diff --git a/src/Hackage/Security/Client/Verify.hs b/src/Hackage/Security/Client/Verify.hs
--- a/src/Hackage/Security/Client/Verify.hs
+++ b/src/Hackage/Security/Client/Verify.hs
@@ -10,6 +10,7 @@
   , liftIO
   ) where
 
+import MyPrelude
 import Control.Exception
 import Control.Monad.Reader
 import Data.IORef
diff --git a/src/Hackage/Security/JSON.hs b/src/Hackage/Security/JSON.hs
--- a/src/Hackage/Security/JSON.hs
+++ b/src/Hackage/Security/JSON.hs
@@ -38,6 +38,7 @@
   , module Hackage.Security.Util.JSON
   ) where
 
+import MyPrelude
 import Control.Arrow (first, second)
 import Control.Exception
 import Control.Monad.Except
diff --git a/src/Hackage/Security/Key.hs b/src/Hackage/Security/Key.hs
--- a/src/Hackage/Security/Key.hs
+++ b/src/Hackage/Security/Key.hs
@@ -25,6 +25,7 @@
   , verify
   ) where
 
+import MyPrelude
 import Control.Monad
 import Data.Functor.Identity
 import Data.Typeable (Typeable)
diff --git a/src/Hackage/Security/Key/Env.hs b/src/Hackage/Security/Key/Env.hs
--- a/src/Hackage/Security/Key/Env.hs
+++ b/src/Hackage/Security/Key/Env.hs
@@ -12,7 +12,7 @@
   , union
   ) where
 
-import Prelude hiding (lookup, null)
+import MyPrelude hiding (lookup, null)
 import Control.Monad
 import Data.Map (Map)
 import qualified Data.Map as Map
diff --git a/src/Hackage/Security/TUF/Common.hs b/src/Hackage/Security/TUF/Common.hs
--- a/src/Hackage/Security/TUF/Common.hs
+++ b/src/Hackage/Security/TUF/Common.hs
@@ -6,6 +6,7 @@
   , KeyThreshold(..)
   ) where
 
+import MyPrelude
 import Hackage.Security.JSON
 
 {-------------------------------------------------------------------------------
diff --git a/src/Hackage/Security/TUF/FileInfo.hs b/src/Hackage/Security/TUF/FileInfo.hs
--- a/src/Hackage/Security/TUF/FileInfo.hs
+++ b/src/Hackage/Security/TUF/FileInfo.hs
@@ -13,7 +13,7 @@
   , Int54
   ) where
 
-import Prelude hiding (lookup)
+import MyPrelude hiding (lookup)
 import Data.Map (Map)
 import qualified Crypto.Hash.SHA256   as SHA256
 import qualified Data.Map             as Map
diff --git a/src/Hackage/Security/TUF/FileMap.hs b/src/Hackage/Security/TUF/FileMap.hs
--- a/src/Hackage/Security/TUF/FileMap.hs
+++ b/src/Hackage/Security/TUF/FileMap.hs
@@ -18,7 +18,7 @@
   , fileMapChanges
   ) where
 
-import Prelude hiding (lookup)
+import MyPrelude hiding (lookup)
 import Control.Arrow (second)
 import Data.Map (Map)
 import qualified Data.Map as Map
diff --git a/src/Hackage/Security/TUF/Header.hs b/src/Hackage/Security/TUF/Header.hs
--- a/src/Hackage/Security/TUF/Header.hs
+++ b/src/Hackage/Security/TUF/Header.hs
@@ -12,6 +12,7 @@
   , versionIncrement
   ) where
 
+import MyPrelude
 import Data.Time
 import Data.Typeable (Typeable)
 
diff --git a/src/Hackage/Security/TUF/Layout/Cache.hs b/src/Hackage/Security/TUF/Layout/Cache.hs
--- a/src/Hackage/Security/TUF/Layout/Cache.hs
+++ b/src/Hackage/Security/TUF/Layout/Cache.hs
@@ -4,6 +4,7 @@
   , cabalCacheLayout
   ) where
 
+import MyPrelude
 import Hackage.Security.TUF.Paths
 import Hackage.Security.Util.Path
 
diff --git a/src/Hackage/Security/TUF/Layout/Index.hs b/src/Hackage/Security/TUF/Layout/Index.hs
--- a/src/Hackage/Security/TUF/Layout/Index.hs
+++ b/src/Hackage/Security/TUF/Layout/Index.hs
@@ -9,6 +9,7 @@
   , indexLayoutPkgPrefs
   ) where
 
+import MyPrelude
 import Distribution.Package
 import Distribution.Text
 
diff --git a/src/Hackage/Security/TUF/Layout/Repo.hs b/src/Hackage/Security/TUF/Layout/Repo.hs
--- a/src/Hackage/Security/TUF/Layout/Repo.hs
+++ b/src/Hackage/Security/TUF/Layout/Repo.hs
@@ -5,6 +5,7 @@
   , cabalLocalRepoLayout
   ) where
 
+import MyPrelude
 import Distribution.Package
 import Distribution.Text
 
diff --git a/src/Hackage/Security/TUF/Mirrors.hs b/src/Hackage/Security/TUF/Mirrors.hs
--- a/src/Hackage/Security/TUF/Mirrors.hs
+++ b/src/Hackage/Security/TUF/Mirrors.hs
@@ -9,6 +9,7 @@
   , describeMirror
   ) where
 
+import MyPrelude
 import Control.Monad.Except
 import Network.URI
 
diff --git a/src/Hackage/Security/TUF/Paths.hs b/src/Hackage/Security/TUF/Paths.hs
--- a/src/Hackage/Security/TUF/Paths.hs
+++ b/src/Hackage/Security/TUF/Paths.hs
@@ -14,6 +14,7 @@
   , anchorCachePath
   ) where
 
+import MyPrelude
 import Hackage.Security.Util.Path
 import Hackage.Security.Util.Pretty
 
diff --git a/src/Hackage/Security/TUF/Patterns.hs b/src/Hackage/Security/TUF/Patterns.hs
--- a/src/Hackage/Security/TUF/Patterns.hs
+++ b/src/Hackage/Security/TUF/Patterns.hs
@@ -26,6 +26,7 @@
   , qqd
   ) where
 
+import MyPrelude
 import Control.Monad.Except
 import Language.Haskell.TH (Q, Exp)
 import System.FilePath.Posix
diff --git a/src/Hackage/Security/TUF/Root.hs b/src/Hackage/Security/TUF/Root.hs
--- a/src/Hackage/Security/TUF/Root.hs
+++ b/src/Hackage/Security/TUF/Root.hs
@@ -6,6 +6,7 @@
   , RoleSpec(..)
   ) where
 
+import MyPrelude
 import Hackage.Security.JSON
 import Hackage.Security.Key
 import Hackage.Security.Key.Env (KeyEnv)
diff --git a/src/Hackage/Security/TUF/Signed.hs b/src/Hackage/Security/TUF/Signed.hs
--- a/src/Hackage/Security/TUF/Signed.hs
+++ b/src/Hackage/Security/TUF/Signed.hs
@@ -27,6 +27,7 @@
   , toPreSignatures
   ) where
 
+import MyPrelude
 import Control.Monad
 import Data.Functor.Identity
 import qualified Data.ByteString      as BS
diff --git a/src/Hackage/Security/TUF/Snapshot.hs b/src/Hackage/Security/TUF/Snapshot.hs
--- a/src/Hackage/Security/TUF/Snapshot.hs
+++ b/src/Hackage/Security/TUF/Snapshot.hs
@@ -3,6 +3,7 @@
     Snapshot(..)
   ) where
 
+import MyPrelude
 import Control.Monad.Except
 import Control.Monad.Reader
 
diff --git a/src/Hackage/Security/TUF/Targets.hs b/src/Hackage/Security/TUF/Targets.hs
--- a/src/Hackage/Security/TUF/Targets.hs
+++ b/src/Hackage/Security/TUF/Targets.hs
@@ -8,6 +8,7 @@
   , targetsLookup
   ) where
 
+import MyPrelude
 import Hackage.Security.JSON
 import Hackage.Security.Key
 import Hackage.Security.Key.Env (KeyEnv)
diff --git a/src/Hackage/Security/TUF/Timestamp.hs b/src/Hackage/Security/TUF/Timestamp.hs
--- a/src/Hackage/Security/TUF/Timestamp.hs
+++ b/src/Hackage/Security/TUF/Timestamp.hs
@@ -3,6 +3,7 @@
     Timestamp(..)
   ) where
 
+import MyPrelude
 import Control.Monad.Except
 import Control.Monad.Reader
 
diff --git a/src/Hackage/Security/Trusted.hs b/src/Hackage/Security/Trusted.hs
--- a/src/Hackage/Security/Trusted.hs
+++ b/src/Hackage/Security/Trusted.hs
@@ -12,6 +12,7 @@
   , trustedFileInfoEqual
   ) where
 
+import MyPrelude
 import Data.Function (on)
 import Data.Time
 import Hackage.Security.TUF
diff --git a/src/Hackage/Security/Trusted/TCB.hs b/src/Hackage/Security/Trusted/TCB.hs
--- a/src/Hackage/Security/Trusted/TCB.hs
+++ b/src/Hackage/Security/Trusted/TCB.hs
@@ -26,6 +26,7 @@
 #endif
   ) where
 
+import MyPrelude
 import Control.Exception
 import Control.Monad.Except
 import Data.Typeable
diff --git a/src/Hackage/Security/Util/Base64.hs b/src/Hackage/Security/Util/Base64.hs
--- a/src/Hackage/Security/Util/Base64.hs
+++ b/src/Hackage/Security/Util/Base64.hs
@@ -4,6 +4,7 @@
   , toByteString
   ) where
 
+import MyPrelude
 import Data.ByteString (ByteString)
 import qualified Data.ByteString.Char8  as C8  -- only called on B64-enc strings
 import qualified Data.ByteString.Base64 as B64
diff --git a/src/Hackage/Security/Util/Checked.hs b/src/Hackage/Security/Util/Checked.hs
--- a/src/Hackage/Security/Util/Checked.hs
+++ b/src/Hackage/Security/Util/Checked.hs
@@ -25,6 +25,7 @@
   , internalError
   ) where
 
+import MyPrelude
 import Control.Exception (Exception, IOException)
 import qualified Control.Exception as Base
 import Data.Typeable (Typeable)
diff --git a/src/Hackage/Security/Util/Exit.hs b/src/Hackage/Security/Util/Exit.hs
--- a/src/Hackage/Security/Util/Exit.hs
+++ b/src/Hackage/Security/Util/Exit.hs
@@ -1,5 +1,6 @@
 module Hackage.Security.Util.Exit where
 
+import MyPrelude
 import Control.Monad.Except
 
 {-------------------------------------------------------------------------------
diff --git a/src/Hackage/Security/Util/IO.hs b/src/Hackage/Security/Util/IO.hs
--- a/src/Hackage/Security/Util/IO.hs
+++ b/src/Hackage/Security/Util/IO.hs
@@ -9,6 +9,7 @@
   , timedIO
   ) where
 
+import MyPrelude
 import Control.Concurrent (threadDelay)
 import Control.Exception
 import Data.Time
diff --git a/src/Hackage/Security/Util/JSON.hs b/src/Hackage/Security/Util/JSON.hs
--- a/src/Hackage/Security/Util/JSON.hs
+++ b/src/Hackage/Security/Util/JSON.hs
@@ -23,6 +23,7 @@
   , Int54
   ) where
 
+import MyPrelude
 import Control.Monad (liftM)
 import Data.Maybe (catMaybes)
 import Data.Map (Map)
diff --git a/src/Hackage/Security/Util/Lens.hs b/src/Hackage/Security/Util/Lens.hs
--- a/src/Hackage/Security/Util/Lens.hs
+++ b/src/Hackage/Security/Util/Lens.hs
@@ -14,6 +14,7 @@
   , set
   ) where
 
+import MyPrelude
 import Control.Applicative
 import Data.Functor.Identity
 
diff --git a/src/Hackage/Security/Util/Path.hs b/src/Hackage/Security/Util/Path.hs
--- a/src/Hackage/Security/Util/Path.hs
+++ b/src/Hackage/Security/Util/Path.hs
@@ -83,6 +83,7 @@
   , IO.hSeek
   ) where
 
+import MyPrelude
 import Control.Monad
 import Data.List (isPrefixOf)
 import System.IO (IOMode(..), BufferMode(..), Handle, SeekMode(..))
@@ -294,7 +295,7 @@
 fromAbsoluteFilePath :: FilePath -> Path Absolute
 fromAbsoluteFilePath fp
   | FP.Native.isAbsolute fp = mkPathNative fp
-  | otherwise               = error "fromAbsoluteFilePath: not an absolute path"
+  | otherwise               = error ("fromAbsoluteFilePath: not an absolute path: " ++ fp)
 
 {-------------------------------------------------------------------------------
   Wrappers around System.IO
diff --git a/src/Hackage/Security/Util/Pretty.hs b/src/Hackage/Security/Util/Pretty.hs
--- a/src/Hackage/Security/Util/Pretty.hs
+++ b/src/Hackage/Security/Util/Pretty.hs
@@ -3,6 +3,8 @@
     Pretty(..)
   ) where
 
+import MyPrelude
+
 -- | Produce a human-readable string
 class Pretty a where
   pretty :: a -> String
diff --git a/src/Hackage/Security/Util/Some.hs b/src/Hackage/Security/Util/Some.hs
--- a/src/Hackage/Security/Util/Some.hs
+++ b/src/Hackage/Security/Util/Some.hs
@@ -19,6 +19,7 @@
 #endif
   ) where
 
+import MyPrelude
 #if MIN_VERSION_base(4,7,0)
 import Data.Typeable (Typeable)
 #else
diff --git a/src/Hackage/Security/Util/Stack.hs b/src/Hackage/Security/Util/Stack.hs
--- a/src/Hackage/Security/Util/Stack.hs
+++ b/src/Hackage/Security/Util/Stack.hs
@@ -3,6 +3,8 @@
     (:-)(..)
   ) where
 
+import MyPrelude
+
 data h :- t = h :- t
   deriving (Eq, Show)
 infixr 5 :-
diff --git a/src/Hackage/Security/Util/TypedEmbedded.hs b/src/Hackage/Security/Util/TypedEmbedded.hs
--- a/src/Hackage/Security/Util/TypedEmbedded.hs
+++ b/src/Hackage/Security/Util/TypedEmbedded.hs
@@ -7,6 +7,8 @@
   , AsType(..)
   ) where
 
+import MyPrelude
+
 -- | Type equality proofs
 --
 -- This is a direct copy of "type-equality:Data.Type.Equality"; if we don't
diff --git a/src/MyPrelude.hs b/src/MyPrelude.hs
new file mode 100644
--- /dev/null
+++ b/src/MyPrelude.hs
@@ -0,0 +1,31 @@
+-- | Smooth over differences between various ghc versions by making older
+-- preludes look like 4.8.0
+{-# LANGUAGE CPP #-}
+module MyPrelude (
+    module P
+#if !MIN_VERSION_base(4,8,0)
+  , Applicative(..)
+  , Monoid(..)
+  , (<$>)
+  , (<$)
+  , Traversable(traverse)
+  , displayException
+#endif
+  ) where
+
+#if MIN_VERSION_base(4,8,0)
+import Prelude as P
+#else
+#if MIN_VERSION_base(4,6,0)
+import Prelude as P
+#else
+import Prelude as P hiding (catch)
+#endif
+import Control.Applicative
+import Control.Exception (Exception)
+import Data.Monoid
+import Data.Traversable (Traversable(traverse))
+
+displayException :: Exception e => e -> String
+displayException = show
+#endif
diff --git a/src/Prelude.hs b/src/Prelude.hs
deleted file mode 100644
--- a/src/Prelude.hs
+++ /dev/null
@@ -1,32 +0,0 @@
--- | Smooth over differences between various ghc versions by making older
--- preludes look like 4.8.0
-{-# LANGUAGE PackageImports #-}
-{-# LANGUAGE CPP #-}
-module Prelude (
-    module P
-#if !MIN_VERSION_base(4,8,0)
-  , Applicative(..)
-  , Monoid(..)
-  , (<$>)
-  , (<$)
-  , Traversable(traverse)
-  , displayException
-#endif
-  ) where
-
-#if MIN_VERSION_base(4,8,0)
-import "base" Prelude as P
-#else
-#if MIN_VERSION_base(4,6,0)
-import "base" Prelude as P
-#else
-import "base" Prelude as P hiding (catch)
-#endif
-import Control.Applicative
-import Control.Exception (Exception)
-import Data.Monoid
-import Data.Traversable (Traversable(traverse))
-
-displayException :: Exception e => e -> String
-displayException = show
-#endif
diff --git a/src/Text/JSON/Canonical.hs b/src/Text/JSON/Canonical.hs
--- a/src/Text/JSON/Canonical.hs
+++ b/src/Text/JSON/Canonical.hs
@@ -30,6 +30,7 @@
   , prettyCanonicalJSON
   ) where
 
+import MyPrelude
 import Text.ParserCombinators.Parsec
          ( CharParser, (<|>), (<?>), many, between, sepBy
          , satisfy, char, string, digit, spaces
