diff --git a/.github/workflows/haskell.yml b/.github/workflows/haskell.yml
--- a/.github/workflows/haskell.yml
+++ b/.github/workflows/haskell.yml
@@ -17,11 +17,10 @@
       matrix:
         os: [ubuntu-latest]
         ghc-version:
-          [ "8.8"
-          , "8.10"
-          , "9.0"
+          [ "9.0"
           , "9.2"
           , "9.4"
+          , "9.6"
           ]
 
     steps:
@@ -30,7 +29,7 @@
           submodules: 'recursive'
 
       - name: Set up GHC ${{ matrix.ghc-version }}
-        uses: haskell/actions/setup@v2
+        uses: haskell-actions/setup@v2
         id: setup
         with:
           ghc-version: ${{ matrix.ghc-version }}
@@ -74,3 +73,9 @@
 
       - name: Run tests
         run: cabal test all --test-option=--color --test-show-details=streaming --jobs=1
+
+      - name: Check cabal file
+        run: cabal check
+
+      - name: Build documentation
+        run: cabal haddock all
diff --git a/.gitmodules b/.gitmodules
--- a/.gitmodules
+++ b/.gitmodules
@@ -4,4 +4,4 @@
 	branch = 3.8
 [submodule "hackage-security"]
 	path = hackage-security
-	url = https://github.com/gentoo-haskell/hackage-security.git
+	url = https://github.com/haskell/hackage-security.git
diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,30 @@
+## v0.8.5.0 (2023-02-05)
+
+Release v0.8.5.0
+
+- Add a warning for when a particular component of a package is unbuildable
+  for the automatically-chosen GHC version. This is upgraded to a fatal error
+  if any of the libraries in the package are unbuildable. (This should help a
+  bit to prevent #116 from biting people).
+
+- Add support for USE flags when resolving 'pkgconfig' dependencies in cabal to 
+  portage dependencies.
+
+- Update supported GHC versions when resolving the minimal GHC required for a
+  package:
+    - Versions 8.10.6 and earlier were removed
+    - Added 9.2.7, 9.2.8, 9.4.5, 9.4.6, 9.4.7, 9.4.8, 9.6.3, and 9.6.4
+
+  (Not defaulting to very old GHC versions will help avoid #116 as well).
+
+- Stop adding special slot numbers to `dev-haskell/quickcheck` and 
+  `dev-haskell/hdbd`. The functionality for adding special slot numbers for
+  packages was scrapped.
+
+  (See: https://github.com/gentoo-haskell/gentoo-haskell/issues/1502)
+
+- Update bundled `hackage-security` to newer commit.
+
 ## v0.8.4.0 (2023-06-03)
 
 Release v0.8.4.0
diff --git a/cabal/Cabal-syntax/Cabal-syntax.cabal b/cabal/Cabal-syntax/Cabal-syntax.cabal
--- a/cabal/Cabal-syntax/Cabal-syntax.cabal
+++ b/cabal/Cabal-syntax/Cabal-syntax.cabal
@@ -1,6 +1,7 @@
 cabal-version: 1.22
 name:          Cabal-syntax
 version:       3.8.1.0
+x-revision:    2
 copyright:     2003-2022, Cabal Development Team (see AUTHORS file)
 license:       BSD3
 license-file:  LICENSE
@@ -29,21 +30,21 @@
 
   build-depends:
     array      >= 0.4.0.1  && < 0.6,
-    base       >= 4.6      && < 5,
+    base       >= 4.9      && < 5,
     binary     >= 0.7      && < 0.9,
     bytestring >= 0.10.0.0 && < 0.12,
     containers >= 0.5.0.0  && < 0.7,
     deepseq    >= 1.3.0.1  && < 1.5,
     directory  >= 1.2      && < 1.4,
     filepath   >= 1.3.0.1  && < 1.5,
-    mtl        >= 2.1      && < 2.3,
+    mtl        >= 2.1      && < 2.4,
     parsec     >= 3.1.13.0 && < 3.2,
     pretty     >= 1.1.1    && < 1.2,
     text       (>= 1.2.3.0 && < 1.3) || (>= 2.0 && < 2.1),
     time       >= 1.4.0.1  && < 1.13,
     -- transformers-0.4.0.0 doesn't have record syntax e.g. for Identity
     -- See also https://github.com/ekmett/transformers-compat/issues/35
-    transformers (>= 0.3      && < 0.4) || (>=0.4.1.0 && <0.6)
+    transformers (>= 0.3      && < 0.4) || (>=0.4.1.0 && <0.7)
 
   if os(windows)
     build-depends: Win32 >= 2.3.0.0 && < 2.14
@@ -51,11 +52,9 @@
     build-depends: unix  >= 2.6.0.0 && < 2.8
 
   ghc-options: -Wall -fno-ignore-asserts -fwarn-tabs -fwarn-incomplete-uni-patterns -fwarn-incomplete-record-updates
-
-  if impl(ghc >= 8.0)
-    ghc-options: -Wcompat -Wnoncanonical-monad-instances
+  ghc-options: -Wcompat -Wnoncanonical-monad-instances
 
-  if impl(ghc >= 8.0) && impl(ghc < 8.8)
+  if impl(ghc < 8.8)
     ghc-options: -Wnoncanonical-monadfail-instances
 
   exposed-modules:
diff --git a/cabal/Cabal-tests/Cabal-tests.cabal b/cabal/Cabal-tests/Cabal-tests.cabal
--- a/cabal/Cabal-tests/Cabal-tests.cabal
+++ b/cabal/Cabal-tests/Cabal-tests.cabal
@@ -160,7 +160,7 @@
     , clock                 >=0.8      && <0.9
     , optparse-applicative  >=0.13.2.0 && <0.17
     , stm                   >=2.4.5.0  && <2.6
-    , tar                   >=0.5.0.3  && <0.6
+    , tar                   >=0.5.0.3  && <0.7
     , tree-diff             >=0.1      && <0.3
 
   ghc-options:        -Wall -rtsopts -threaded
diff --git a/cabal/Cabal/Cabal.cabal b/cabal/Cabal/Cabal.cabal
--- a/cabal/Cabal/Cabal.cabal
+++ b/cabal/Cabal/Cabal.cabal
@@ -299,8 +299,8 @@
   build-depends:
     -- transformers-0.4.0.0 doesn't have record syntax e.g. for Identity
     -- See also https://github.com/ekmett/transformers-compat/issues/35
-    transformers (>= 0.3      && < 0.4) || (>=0.4.1.0 && <0.6),
-    mtl           >= 2.1      && < 2.3,
+    transformers (>= 0.3      && < 0.4) || (>= 0.4.1.0 && < 0.7),
+    mtl           >= 2.1      && < 2.4,
     text         (>= 1.2.3.0  && < 1.3) || (>= 2.0 && < 2.1),
     parsec        >= 3.1.13.0 && < 3.2
 
diff --git a/cabal/cabal-install-solver/src/Distribution/Solver/Modular/Linking.hs b/cabal/cabal-install-solver/src/Distribution/Solver/Modular/Linking.hs
--- a/cabal/cabal-install-solver/src/Distribution/Solver/Modular/Linking.hs
+++ b/cabal/cabal-install-solver/src/Distribution/Solver/Modular/Linking.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 
@@ -11,6 +12,9 @@
 import Distribution.Solver.Compat.Prelude hiding (get,put)
 
 import Control.Exception (assert)
+#if MIN_VERSION_mtl(2,3,0)
+import Control.Monad
+#endif
 import Control.Monad.Reader
 import Control.Monad.State
 import Data.Map ((!))
diff --git a/cabal/cabal-install-solver/src/Distribution/Solver/Modular/Validate.hs b/cabal/cabal-install-solver/src/Distribution/Solver/Modular/Validate.hs
--- a/cabal/cabal-install-solver/src/Distribution/Solver/Modular/Validate.hs
+++ b/cabal/cabal-install-solver/src/Distribution/Solver/Modular/Validate.hs
@@ -12,6 +12,9 @@
 -- assignment returned by exploration of the tree should be a complete valid
 -- assignment, i.e., actually constitute a solution.
 
+#if MIN_VERSION_mtl(2,3,0)
+import Control.Monad
+#endif
 import Control.Monad.Reader
 import Data.Either (lefts)
 import Data.Function (on)
diff --git a/cabal/cabal-install/cabal-install.cabal b/cabal/cabal-install/cabal-install.cabal
--- a/cabal/cabal-install/cabal-install.cabal
+++ b/cabal/cabal-install/cabal-install.cabal
@@ -42,7 +42,9 @@
     ghc-options: -Wall -Wcompat -Wnoncanonical-monad-instances -Wincomplete-uni-patterns -Wincomplete-record-updates
     if impl(ghc < 8.8)
       ghc-options: -Wnoncanonical-monadfail-instances
-    if impl(ghc >=8.10)
+    if impl(ghc >=9.0)
+      -- Warning: even though introduced with GHC 8.10, -Wunused-packages
+      -- gives false positives with GHC 8.10.
       ghc-options: -Wunused-packages
 
 common base-dep
@@ -100,6 +102,7 @@
         Distribution.Client.Compat.Prelude
         Distribution.Client.Compat.Process
         Distribution.Client.Compat.Semaphore
+        Distribution.Client.Compat.Tar
         Distribution.Client.Config
         Distribution.Client.Configure
         Distribution.Client.Dependency
@@ -219,7 +222,7 @@
         process    >= 1.2.3.0  && < 1.7,
         random     >= 1.2      && < 1.3,
         stm        >= 2.0      && < 2.6,
-        tar        >= 0.5.0.3  && < 0.6,
+        tar        >= 0.5.0.3  && < 0.7,
         time       >= 1.5.0.1  && < 1.13,
         zlib       >= 0.5.3    && < 0.7,
         hackage-security >= 0.6.2.0 && < 0.7,
diff --git a/cabal/cabal-install/src/Distribution/Client/Compat/Tar.hs b/cabal/cabal-install/src/Distribution/Client/Compat/Tar.hs
new file mode 100644
--- /dev/null
+++ b/cabal/cabal-install/src/Distribution/Client/Compat/Tar.hs
@@ -0,0 +1,68 @@
+{-# LANGUAGE CPP #-}
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+
+{- FOURMOLU_DISABLE -}
+module Distribution.Client.Compat.Tar
+  ( extractTarGzFile
+#if MIN_VERSION_tar(0,6,0)
+  , Tar.Entry
+  , Tar.Entries
+  , Tar.GenEntries (..)
+  , Tar.GenEntryContent (..)
+  , Tar.entryContent
+#else
+  , Tar.Entries (..)
+  , Tar.Entry (..)
+  , Tar.EntryContent (..)
+#endif
+  ) where
+{- FOURMOLU_ENABLE -}
+
+import Distribution.Client.Compat.Prelude
+import Prelude ()
+
+import qualified Codec.Archive.Tar as Tar
+import qualified Codec.Archive.Tar.Check as Tar
+#if MIN_VERSION_tar(0,6,0)
+#else
+import qualified Codec.Archive.Tar.Entry as Tar
+#endif
+import qualified Data.ByteString.Lazy as BS
+import qualified Distribution.Client.GZipUtils as GZipUtils
+
+instance (Exception a, Exception b) => Exception (Either a b) where
+  toException (Left e) = toException e
+  toException (Right e) = toException e
+
+  fromException e =
+    case fromException e of
+      Just e' -> Just (Left e')
+      Nothing -> case fromException e of
+        Just e' -> Just (Right e')
+        Nothing -> Nothing
+
+{- FOURMOLU_DISABLE -}
+extractTarGzFile
+  :: FilePath
+  -- ^ Destination directory
+  -> FilePath
+  -- ^ Expected subdir (to check for tarbombs)
+  -> FilePath
+  -- ^ Tarball
+  -> IO ()
+extractTarGzFile dir expected tar =
+#if MIN_VERSION_tar(0,6,0)
+  Tar.unpackAndCheck
+    ( \x ->
+        SomeException <$> Tar.checkEntryTarbomb expected x
+          <|> SomeException <$> Tar.checkEntrySecurity x
+    )
+    dir
+#else
+  Tar.unpack dir
+    . Tar.checkTarbomb expected
+#endif
+  . Tar.read
+  . GZipUtils.maybeDecompress
+  =<< BS.readFile tar
+{- FOURMOLU_ENABLE -}
diff --git a/cabal/cabal-install/src/Distribution/Client/ProjectPlanning.hs b/cabal/cabal-install/src/Distribution/Client/ProjectPlanning.hs
--- a/cabal/cabal-install/src/Distribution/Client/ProjectPlanning.hs
+++ b/cabal/cabal-install/src/Distribution/Client/ProjectPlanning.hs
@@ -170,6 +170,9 @@
 import qualified Text.PrettyPrint as Disp
 import qualified Data.Map as Map
 import qualified Data.Set as Set
+#if MIN_VERSION_mtl(2,3,0)
+import           Control.Monad
+#endif
 import           Control.Monad.State as State
 import           Control.Exception (assert)
 import           Data.List (groupBy, deleteBy)
diff --git a/cabal/cabal-install/src/Distribution/Client/Tar.hs b/cabal/cabal-install/src/Distribution/Client/Tar.hs
--- a/cabal/cabal-install/src/Distribution/Client/Tar.hs
+++ b/cabal/cabal-install/src/Distribution/Client/Tar.hs
@@ -14,10 +14,11 @@
 -- Reading, writing and manipulating \"@.tar@\" archive files.
 --
 -----------------------------------------------------------------------------
-module Distribution.Client.Tar (
-  -- * @tar.gz@ operations
+
+module Distribution.Client.Tar
+  ( -- * @tar.gz@ operations
   createTarGzFile,
-  extractTarGzFile,
+  TarComp.extractTarGzFile,
 
   -- * Other local utils
   buildTreeRefTypeCode,
@@ -31,12 +32,11 @@
 import Distribution.Client.Compat.Prelude
 import Prelude ()
 
-import qualified Data.ByteString.Lazy    as BS
-import qualified Codec.Archive.Tar       as Tar
+import qualified Codec.Archive.Tar as Tar
 import qualified Codec.Archive.Tar.Entry as Tar
-import qualified Codec.Archive.Tar.Check as Tar
-import qualified Codec.Compression.GZip  as GZip
-import qualified Distribution.Client.GZipUtils as GZipUtils
+import qualified Codec.Compression.GZip as GZip
+import qualified Data.ByteString.Lazy as BS
+import qualified Distribution.Client.Compat.Tar as TarComp
 
 -- for foldEntries...
 import Control.Exception (throw)
@@ -51,26 +51,6 @@
                 -> IO ()
 createTarGzFile tar base dir =
   BS.writeFile tar . GZip.compress . Tar.write =<< Tar.pack base [dir]
-
-extractTarGzFile :: FilePath -- ^ Destination directory
-                 -> FilePath -- ^ Expected subdir (to check for tarbombs)
-                 -> FilePath -- ^ Tarball
-                -> IO ()
-extractTarGzFile dir expected tar =
-  Tar.unpack dir . Tar.checkTarbomb expected . Tar.read
-  . GZipUtils.maybeDecompress =<< BS.readFile tar
-
-instance (Exception a, Exception b) => Exception (Either a b) where
-  toException (Left  e) = toException e
-  toException (Right e) = toException e
-
-  fromException e =
-    case fromException e of
-      Just e' -> Just (Left e')
-      Nothing -> case fromException e of
-                   Just e' -> Just (Right e')
-                   Nothing -> Nothing
-
 
 -- | Type code for the local build tree reference entry type. We don't use the
 -- symbolic link entry type because it allows only 100 ASCII characters for the
diff --git a/cabal/cabal-install/tests/UnitTests/Distribution/Client/Tar.hs b/cabal/cabal-install/tests/UnitTests/Distribution/Client/Tar.hs
--- a/cabal/cabal-install/tests/UnitTests/Distribution/Client/Tar.hs
+++ b/cabal/cabal-install/tests/UnitTests/Distribution/Client/Tar.hs
@@ -2,17 +2,17 @@
   tests
   ) where
 
-import Distribution.Client.Tar ( filterEntries
-                               , filterEntriesM
-                               )
-import Codec.Archive.Tar       ( Entries(..)
-                               , foldEntries
-                               )
-import Codec.Archive.Tar.Entry ( EntryContent(..)
-                               , simpleEntry
-                               , Entry(..)
-                               , toTarPath
-                               )
+import Codec.Archive.Tar
+  ( foldEntries
+  )
+import Codec.Archive.Tar.Entry
+  ( simpleEntry
+  , toTarPath
+  )
+import Distribution.Client.Tar
+  ( filterEntries
+  , filterEntriesM
+  )
 
 import Test.Tasty
 import Test.Tasty.HUnit
@@ -20,6 +20,8 @@
 import qualified Data.ByteString.Lazy as BS
 import qualified Data.ByteString.Lazy.Char8 as BS.Char8
 import Control.Monad.Writer.Lazy (runWriterT, tell)
+
+import Distribution.Client.Compat.Tar
 
 tests :: [TestTree]
 tests = [ testCase "filterEntries" filterTest
diff --git a/hackage-security/.github/workflows/haskell-ci.yml b/hackage-security/.github/workflows/haskell-ci.yml
--- a/hackage-security/.github/workflows/haskell-ci.yml
+++ b/hackage-security/.github/workflows/haskell-ci.yml
@@ -6,16 +6,20 @@
 #
 #   haskell-ci regenerate
 #
-# For more information, see https://github.com/haskell-CI/haskell-ci
+# For more information, see https://github.com/andreasabel/haskell-ci
 #
-# version: 0.15.20220812
+# version: 0.17.20240106
 #
-# REGENDATA ("0.15.20220812",["github","cabal.project"])
+# REGENDATA ("0.17.20240106",["github","cabal.project"])
 #
 name: Haskell-CI
 on:
-  - push
-  - pull_request
+  push:
+    branches:
+      - master
+  pull_request:
+    branches:
+      - master
 jobs:
   linux:
     name: Haskell-CI - Linux - ${{ matrix.compiler }}
@@ -23,21 +27,31 @@
     timeout-minutes:
       60
     container:
-      image: buildpack-deps:bionic
+      image: buildpack-deps:focal
     continue-on-error: ${{ matrix.allow-failure }}
     strategy:
       matrix:
         include:
-          - compiler: ghc-9.4.1
+          - compiler: ghc-9.8.1
             compilerKind: ghc
-            compilerVersion: 9.4.1
+            compilerVersion: 9.8.1
             setup-method: ghcup
             allow-failure: false
-          - compiler: ghc-9.2.4
+          - compiler: ghc-9.6.3
             compilerKind: ghc
-            compilerVersion: 9.2.4
+            compilerVersion: 9.6.3
             setup-method: ghcup
             allow-failure: false
+          - compiler: ghc-9.4.8
+            compilerKind: ghc
+            compilerVersion: 9.4.8
+            setup-method: ghcup
+            allow-failure: false
+          - compiler: ghc-9.2.8
+            compilerKind: ghc
+            compilerVersion: 9.2.8
+            setup-method: ghcup
+            allow-failure: false
           - compiler: ghc-9.0.2
             compilerKind: ghc
             compilerVersion: 9.0.2
@@ -51,70 +65,39 @@
           - compiler: ghc-8.8.4
             compilerKind: ghc
             compilerVersion: 8.8.4
-            setup-method: hvr-ppa
+            setup-method: ghcup
             allow-failure: false
           - compiler: ghc-8.6.5
             compilerKind: ghc
             compilerVersion: 8.6.5
-            setup-method: hvr-ppa
+            setup-method: ghcup
             allow-failure: false
           - compiler: ghc-8.4.4
             compilerKind: ghc
             compilerVersion: 8.4.4
-            setup-method: hvr-ppa
+            setup-method: ghcup
             allow-failure: false
           - compiler: ghc-8.2.2
             compilerKind: ghc
             compilerVersion: 8.2.2
-            setup-method: hvr-ppa
+            setup-method: ghcup
             allow-failure: false
           - compiler: ghc-8.0.2
             compilerKind: ghc
             compilerVersion: 8.0.2
-            setup-method: hvr-ppa
-            allow-failure: false
-          - compiler: ghc-7.10.3
-            compilerKind: ghc
-            compilerVersion: 7.10.3
-            setup-method: hvr-ppa
-            allow-failure: false
-          - compiler: ghc-7.8.4
-            compilerKind: ghc
-            compilerVersion: 7.8.4
-            setup-method: hvr-ppa
-            allow-failure: false
-          - compiler: ghc-7.6.3
-            compilerKind: ghc
-            compilerVersion: 7.6.3
-            setup-method: hvr-ppa
-            allow-failure: false
-          - compiler: ghc-7.4.2
-            compilerKind: ghc
-            compilerVersion: 7.4.2
-            setup-method: hvr-ppa
+            setup-method: ghcup
             allow-failure: false
       fail-fast: false
     steps:
       - name: apt
         run: |
           apt-get update
-          apt-get install -y --no-install-recommends gnupg ca-certificates dirmngr curl git software-properties-common libtinfo5
-          if [ "${{ matrix.setup-method }}" = ghcup ]; then
-            mkdir -p "$HOME/.ghcup/bin"
-            curl -sL https://downloads.haskell.org/ghcup/0.1.18.0/x86_64-linux-ghcup-0.1.18.0 > "$HOME/.ghcup/bin/ghcup"
-            chmod a+x "$HOME/.ghcup/bin/ghcup"
-            "$HOME/.ghcup/bin/ghcup" config add-release-channel https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-prereleases-0.0.7.yaml;
-            "$HOME/.ghcup/bin/ghcup" install ghc "$HCVER" || (cat "$HOME"/.ghcup/logs/*.* && false)
-            "$HOME/.ghcup/bin/ghcup" install cabal 3.6.2.0 || (cat "$HOME"/.ghcup/logs/*.* && false)
-          else
-            apt-add-repository -y 'ppa:hvr/ghc'
-            apt-get update
-            apt-get install -y "$HCNAME"
-            mkdir -p "$HOME/.ghcup/bin"
-            curl -sL https://downloads.haskell.org/ghcup/0.1.18.0/x86_64-linux-ghcup-0.1.18.0 > "$HOME/.ghcup/bin/ghcup"
-            chmod a+x "$HOME/.ghcup/bin/ghcup"
-            "$HOME/.ghcup/bin/ghcup" install cabal 3.6.2.0 || (cat "$HOME"/.ghcup/logs/*.* && false)
-          fi
+          apt-get install -y --no-install-recommends gnupg ca-certificates dirmngr curl git software-properties-common libtinfo5 libnuma-dev
+          mkdir -p "$HOME/.ghcup/bin"
+          curl -sL https://downloads.haskell.org/ghcup/0.1.20.0/x86_64-linux-ghcup-0.1.20.0 > "$HOME/.ghcup/bin/ghcup"
+          chmod a+x "$HOME/.ghcup/bin/ghcup"
+          "$HOME/.ghcup/bin/ghcup" install ghc "$HCVER" || (cat "$HOME"/.ghcup/logs/*.* && false)
+          "$HOME/.ghcup/bin/ghcup" install cabal 3.10.2.0 || (cat "$HOME"/.ghcup/logs/*.* && false)
         env:
           HCKIND: ${{ matrix.compilerKind }}
           HCNAME: ${{ matrix.compiler }}
@@ -126,25 +109,18 @@
           echo "CABAL_DIR=$HOME/.cabal" >> "$GITHUB_ENV"
           echo "CABAL_CONFIG=$HOME/.cabal/config" >> "$GITHUB_ENV"
           HCDIR=/opt/$HCKIND/$HCVER
-          if [ "${{ matrix.setup-method }}" = ghcup ]; then
-            HC=$HOME/.ghcup/bin/$HCKIND-$HCVER
-            echo "HC=$HC" >> "$GITHUB_ENV"
-            echo "HCPKG=$HOME/.ghcup/bin/$HCKIND-pkg-$HCVER" >> "$GITHUB_ENV"
-            echo "HADDOCK=$HOME/.ghcup/bin/haddock-$HCVER" >> "$GITHUB_ENV"
-            echo "CABAL=$HOME/.ghcup/bin/cabal-3.6.2.0 -vnormal+nowrap" >> "$GITHUB_ENV"
-          else
-            HC=$HCDIR/bin/$HCKIND
-            echo "HC=$HC" >> "$GITHUB_ENV"
-            echo "HCPKG=$HCDIR/bin/$HCKIND-pkg" >> "$GITHUB_ENV"
-            echo "HADDOCK=$HCDIR/bin/haddock" >> "$GITHUB_ENV"
-            echo "CABAL=$HOME/.ghcup/bin/cabal-3.6.2.0 -vnormal+nowrap" >> "$GITHUB_ENV"
-          fi
-
+          HC=$("$HOME/.ghcup/bin/ghcup" whereis ghc "$HCVER")
+          HCPKG=$(echo "$HC" | sed 's#ghc$#ghc-pkg#')
+          HADDOCK=$(echo "$HC" | sed 's#ghc$#haddock#')
+          echo "HC=$HC" >> "$GITHUB_ENV"
+          echo "HCPKG=$HCPKG" >> "$GITHUB_ENV"
+          echo "HADDOCK=$HADDOCK" >> "$GITHUB_ENV"
+          echo "CABAL=$HOME/.ghcup/bin/cabal-3.10.2.0 -vnormal+nowrap" >> "$GITHUB_ENV"
           HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\d+)\.(\d+)\.(\d+)(\.(\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))')
           echo "HCNUMVER=$HCNUMVER" >> "$GITHUB_ENV"
           echo "ARG_TESTS=--enable-tests" >> "$GITHUB_ENV"
           echo "ARG_BENCH=--enable-benchmarks" >> "$GITHUB_ENV"
-          if [ $((HCNUMVER > 90401)) -ne 0 ] ; then echo "HEADHACKAGE=true" >> "$GITHUB_ENV" ; else echo "HEADHACKAGE=false" >> "$GITHUB_ENV" ; fi
+          echo "HEADHACKAGE=false" >> "$GITHUB_ENV"
           echo "ARG_COMPILER=--$HCKIND --with-compiler=$HC" >> "$GITHUB_ENV"
           echo "GHCJSARITH=0" >> "$GITHUB_ENV"
         env:
@@ -173,19 +149,7 @@
           repository hackage.haskell.org
             url: http://hackage.haskell.org/
           EOF
-          if $HEADHACKAGE; then
           cat >> $CABAL_CONFIG <<EOF
-          repository head.hackage.ghc.haskell.org
-             url: https://ghc.gitlab.haskell.org/head.hackage/
-             secure: True
-             root-keys: 7541f32a4ccca4f97aea3b22f5e593ba2c0267546016b992dfadcd2fe944e55d
-                        26021a13b401500c8eb2761ca95c61f2d625bfef951b939a8124ed12ecf07329
-                        f76d08be13e9a61a377a85e2fb63f4c5435d40f8feb3e12eb05905edb8cdea89
-             key-threshold: 3
-          active-repositories: hackage.haskell.org, head.hackage.ghc.haskell.org:override
-          EOF
-          fi
-          cat >> $CABAL_CONFIG <<EOF
           program-default-options
             ghc-options: $GHCJOBS +RTS -M3G -RTS
           EOF
@@ -201,14 +165,14 @@
       - name: install cabal-plan
         run: |
           mkdir -p $HOME/.cabal/bin
-          curl -sL https://github.com/haskell-hvr/cabal-plan/releases/download/v0.6.2.0/cabal-plan-0.6.2.0-x86_64-linux.xz > cabal-plan.xz
-          echo 'de73600b1836d3f55e32d80385acc055fd97f60eaa0ab68a755302685f5d81bc  cabal-plan.xz' | sha256sum -c -
+          curl -sL https://github.com/haskell-hvr/cabal-plan/releases/download/v0.7.3.0/cabal-plan-0.7.3.0-x86_64-linux.xz > cabal-plan.xz
+          echo 'f62ccb2971567a5f638f2005ad3173dba14693a45154c1508645c52289714cb2  cabal-plan.xz' | sha256sum -c -
           xz -d < cabal-plan.xz > $HOME/.cabal/bin/cabal-plan
           rm -f cabal-plan.xz
           chmod a+x $HOME/.cabal/bin/cabal-plan
           cabal-plan --version
       - name: checkout
-        uses: actions/checkout@v2
+        uses: actions/checkout@v4
         with:
           path: source
       - name: initial cabal.project for sdist
@@ -271,10 +235,9 @@
           if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo "package hackage-security-HTTP" >> cabal.project ; fi
           if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo "    ghc-options: -Werror=missing-methods" >> cabal.project ; fi
           cat >> cabal.project <<EOF
+          constraints: base-compat >= 0.12.2
+          allow-newer: containers
           EOF
-          if $HEADHACKAGE; then
-          echo "allow-newer: $($HCPKG list --simple-output | sed -E 's/([a-zA-Z-]+)-[0-9.]+/*:\1,/g')" >> cabal.project
-          fi
           $HCPKG list --simple-output --names-only | perl -ne 'for (split /\s+/) { print "constraints: $_ installed\n" unless /^(example-client|hackage-repo-tool|hackage-root-tool|hackage-security|hackage-security-HTTP|hackage-security-curl|hackage-security-http-client)$/; }' >> cabal.project.local
           cat cabal.project
           cat cabal.project.local
@@ -282,8 +245,8 @@
         run: |
           $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH --dry-run all
           cabal-plan
-      - name: cache
-        uses: actions/cache@v2
+      - name: restore cache
+        uses: actions/cache/restore@v3
         with:
           key: ${{ runner.os }}-${{ matrix.compiler }}-${{ github.sha }}
           path: ~/.cabal/store
@@ -319,7 +282,7 @@
           ${CABAL} -vnormal check
       - name: haddock
         run: |
-          $CABAL v2-haddock --haddock-all $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all
+          if [ $((HCNUMVER >= 80600)) -ne 0 ] ; then $CABAL v2-haddock --disable-documentation --haddock-all $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all ; fi
       - name: unconstrained build
         run: |
           rm -f cabal.project.local
@@ -327,7 +290,22 @@
       - name: prepare for constraint sets
         run: |
           rm -f cabal.project.local
+      - name: constraint set containers-0.7
+        run: |
+          if [ $((HCNUMVER >= 80200 && HCNUMVER < 90800)) -ne 0 ] ; then $CABAL v2-build $ARG_COMPILER --enable-tests --disable-benchmarks --constraint='containers >= 0.7' all --dry-run ; fi
+          if [ $((HCNUMVER >= 80200 && HCNUMVER < 90800)) -ne 0 ] ; then cabal-plan topo | sort ; fi
+          if [ $((HCNUMVER >= 80200 && HCNUMVER < 90800)) -ne 0 ] ; then $CABAL v2-build $ARG_COMPILER --enable-tests --disable-benchmarks --constraint='containers >= 0.7' --dependencies-only -j2 all ; fi
+          if [ $((HCNUMVER >= 80200 && HCNUMVER < 90800)) -ne 0 ] ; then $CABAL v2-build $ARG_COMPILER --enable-tests --disable-benchmarks --constraint='containers >= 0.7' all ; fi
+          if [ $((HCNUMVER >= 80200 && HCNUMVER < 90800)) -ne 0 ] ; then $CABAL v2-test $ARG_COMPILER --enable-tests --disable-benchmarks --constraint='containers >= 0.7' all ; fi
       - name: constraint set no-lukko
         run: |
+          if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --constraint='hackage-security -lukko' all --dry-run ; fi
+          if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then cabal-plan topo | sort ; fi
           if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --constraint='hackage-security -lukko' --dependencies-only -j2 all ; fi
           if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --constraint='hackage-security -lukko' all ; fi
+      - name: save cache
+        uses: actions/cache/save@v3
+        if: always()
+        with:
+          key: ${{ runner.os }}-${{ matrix.compiler }}-${{ github.sha }}
+          path: ~/.cabal/store
diff --git a/hackage-security/.github/workflows/haskell.yml b/hackage-security/.github/workflows/haskell.yml
--- a/hackage-security/.github/workflows/haskell.yml
+++ b/hackage-security/.github/workflows/haskell.yml
@@ -1,6 +1,12 @@
 name: MacOS, Ubuntu, Windows
 
-on: [push, pull_request]
+on:
+  push:
+    branches:
+      - master
+  pull_request:
+    branches:
+      - master
 
 jobs:
   build:
@@ -9,32 +15,33 @@
     strategy:
       fail-fast: false
       matrix:
-        ghc: ['9.4.1', '9.2.4', '9.0.2', '8.10.7']
+        ghc: ['9.8.1', '9.6.3', '9.4.7']
         os: [ubuntu-latest, macOS-latest, windows-latest]
     steps:
-    - uses: actions/checkout@v2
-    - uses: haskell/actions/setup@v1
+    - uses: actions/checkout@v3
+
+    - uses: haskell-actions/setup@v2
+      id:   setup
       with:
-        ghc-version: ${{ matrix.ghc }}
-        cabal-version: '3.8.1.0'
+        ghc-version:   ${{ matrix.ghc }}
+        # cabal-version: '3.8.1.0'
+        cabal-update:  true
 
     - name: Cache
-      uses: actions/cache@v1
+      uses: actions/cache@v3
       env:
-        cache-name: cache-cabal
+        cache-name: haskell.yml
       with:
-        path: ~/.cabal
-        key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/*.cabal') }}-${{ hashFiles('**/cabal.project') }}
-        restore-keys: |
-          ${{ runner.os }}-build-${{ env.cache-name }}-
-          ${{ runner.os }}-build-
-          ${{ runner.os }}-
+        path: ${{ steps.setup.outputs.cabal-store }}
+        key:          ${{ runner.os }}-${{ env.cache-name }}-ghc-${{ matrix.ghc }}-${{ hashFiles('**/*.cabal', '**/cabal.project') }}
+        restore-keys: ${{ runner.os }}-${{ env.cache-name }}-ghc-${{ matrix.ghc }}-
 
     - name: Install dependencies
       run: |
-        cabal update
         cabal build --only-dependencies --enable-tests --enable-benchmarks -vnormal+nowrap all
+
     - name: Build
       run: cabal build --enable-tests --enable-benchmarks -j1 -vnormal+nowrap all
+
     - name: Run tests
       run: cabal test -j1 -vnormal+nowrap all
diff --git a/hackage-security/cabal.haskell-ci b/hackage-security/cabal.haskell-ci
--- a/hackage-security/cabal.haskell-ci
+++ b/hackage-security/cabal.haskell-ci
@@ -1,5 +1,27 @@
-ghc-head: True
+branches: master
 
+-- Andreas, 2023-07-01: We use some haddock features that are new in 8.6.
+haddock: >= 8.6
+
+-- -- Andreas, 2023-02-20: see https://github.com/haskell/hackage-security/pull/291
+-- -- unconstrained build with head.hackage produces failing build plans
+-- unconstrained: < 9.6
+--
+-- Andreas, 2023-07-01
+-- Ryan GI Scott suggests this instead:
+-- see https://github.com/haskell-CI/haskell-ci/issues/643#issuecomment-1466195957
+raw-project
+  constraints:
+    base-compat >= 0.12.2
+
 constraint-set no-lukko
   ghc: >=8.2
   constraints: hackage-security -lukko
+
+constraint-set containers-0.7
+  ghc: >= 8.2 && < 9.8
+  constraints: containers >= 0.7
+  tests: True
+  run-tests: True
+raw-project
+  allow-newer: containers
diff --git a/hackage-security/example-client/example-client.cabal b/hackage-security/example-client/example-client.cabal
--- a/hackage-security/example-client/example-client.cabal
+++ b/hackage-security/example-client/example-client.cabal
@@ -12,9 +12,17 @@
 cabal-version:       >=1.10
 
 tested-with:
-  GHC==9.4.1, GHC==9.2.4, GHC==9.0.2,
-  GHC==8.10.7, GHC==8.8.4, GHC==8.6.5, GHC==8.4.4, GHC==8.2.2, GHC==8.0.2,
-  GHC==7.10.3, GHC==7.8.4, GHC==7.6.3, GHC==7.4.2
+  GHC == 9.8.1
+  GHC == 9.6.3
+  GHC == 9.4.8
+  GHC == 9.2.8
+  GHC == 9.0.2
+  GHC == 8.10.7
+  GHC == 8.8.4
+  GHC == 8.6.5
+  GHC == 8.4.4
+  GHC == 8.2.2
+  GHC == 8.0.2
 
 flag use-network-uri
   description: Are we using network-uri?
@@ -27,14 +35,14 @@
 
 executable example-client
   main-is:             Main.hs
-  other-modules: Prelude ExampleClient.Options
+  other-modules:       ExampleClient.Options
 
-  build-depends:       base                 >= 4.5 && < 4.18,
+  build-depends:       base                 >= 4.9 && < 4.20,
                        bytestring           >= 0.9,
-                       directory            >= 1.1,
+                       directory            >= 1.2,
                        filepath             >= 1.2,
                        optparse-applicative >= 0.11,
-                       time                 >= 1.2,
+                       time                 >= 1.5,
                        hackage-security     >= 0.5,
                        hackage-security-HTTP,
                        hackage-security-curl,
@@ -57,7 +65,7 @@
     build-depends: network     >= 2.5 && < 2.6
 
   if flag(Cabal-syntax)
-    build-depends: Cabal-syntax >= 3.7 && < 3.9
+    build-depends: Cabal-syntax >= 3.7 && < 3.12
   else
     build-depends: Cabal        >= 1.12 && < 3.7,
                    Cabal-syntax <  3.7
diff --git a/hackage-security/example-client/src/Prelude.hs b/hackage-security/example-client/src/Prelude.hs
deleted file mode 100644
--- a/hackage-security/example-client/src/Prelude.hs
+++ /dev/null
@@ -1,27 +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(..)
-  , (<$>)
-  , (<$)
-  , traverse
-#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 Data.Monoid
-import Data.Traversable (traverse)
-#endif
diff --git a/hackage-security/hackage-repo-tool/ChangeLog.md b/hackage-security/hackage-repo-tool/ChangeLog.md
--- a/hackage-security/hackage-repo-tool/ChangeLog.md
+++ b/hackage-security/hackage-repo-tool/ChangeLog.md
@@ -1,3 +1,7 @@
+Unreleased
+----------
+* Drop support for GHC 7.
+
 0.1.1.3
 -------
 * Compat release for `Cabal-syntax-3.8.1.0`
diff --git a/hackage-security/hackage-repo-tool/hackage-repo-tool.cabal b/hackage-security/hackage-repo-tool/hackage-repo-tool.cabal
--- a/hackage-security/hackage-repo-tool/hackage-repo-tool.cabal
+++ b/hackage-security/hackage-repo-tool/hackage-repo-tool.cabal
@@ -1,6 +1,7 @@
 cabal-version:       1.12
 name:                hackage-repo-tool
 version:             0.1.1.3
+x-revision:          5
 
 build-type:          Simple
 synopsis:            Manage secure file-based package repositories
@@ -23,9 +24,17 @@
 bug-reports:         https://github.com/haskell/hackage-security/issues
 
 tested-with:
-  GHC==9.4.1, GHC==9.2.4, GHC==9.0.2,
-  GHC==8.10.7, GHC==8.8.4, GHC==8.6.5, GHC==8.4.4, GHC==8.2.2, GHC==8.0.2,
-  GHC==7.10.3, GHC==7.8.4, GHC==7.6.3, GHC==7.4.2
+  GHC == 9.8.1
+  GHC == 9.6.3
+  GHC == 9.4.8
+  GHC == 9.2.8
+  GHC == 9.0.2
+  GHC == 8.10.7
+  GHC == 8.8.4
+  GHC == 8.6.5
+  GHC == 8.4.4
+  GHC == 8.2.2
+  GHC == 8.0.2
 
 extra-source-files:
   ChangeLog.md README.md
@@ -38,10 +47,6 @@
   description: Are we using @network-uri@?
   manual: False
 
-flag use-old-time
-  description: Are we using @old-time@?
-  manual: False
-
 flag Cabal-syntax
   description: Are we using Cabal-syntax?
   manual: False
@@ -55,29 +60,22 @@
                        Hackage.Security.RepoTool.Layout.Keys
                        Hackage.Security.RepoTool.Paths
                        Hackage.Security.RepoTool.Util.IO
-                       Prelude
 
   -- For boot libraries we try to accomodate the versions bundled with
   -- the respective GHC release
-  build-depends:       base                 >= 4.5  && < 4.18,
-                       bytestring           >= 0.9  && < 0.12,
-                       directory            >= 1.1  && < 1.4,
+  build-depends:       base                 >= 4.9  && < 4.20,
+                       bytestring           >= 0.9  && < 0.13,
+                       directory            >= 1.2  && < 1.4,
                        filepath             >= 1.3  && < 1.5,
-                       time                 >= 1.4  && < 1.13
+                       time                 >= 1.5  && < 1.13
   if !os(windows)
-    build-depends:     unix                 >= 2.5  && < 2.8
-
-  if flag(use-old-time)
-    build-depends: directory < 1.2
-                 , old-time == 1.1.*
-  else
-    build-depends: directory >= 1.2
+    build-depends:     unix                 >= 2.5  && < 2.9
 
   -- For non-boot libraries we try to support single major versions
   -- to reduce the risk of semantic differences
   build-depends:       microlens            >= 0.4.11.2 && < 0.5,
                        optparse-applicative >= 0.15.1   && < 0.18,
-                       tar                  >= 0.5      && < 0.6,
+                       tar                  >= 0.5      && < 0.7,
                        zlib                 >= 0.6      && < 0.7,
                        hackage-security     >= 0.6      && < 0.7
 
@@ -90,7 +88,7 @@
     build-depends: network     >= 2.5 && < 2.6
 
   if flag(Cabal-syntax)
-    build-depends: Cabal-syntax >= 3.7 && < 3.10
+    build-depends: Cabal-syntax >= 3.7 && < 3.12
   else
     build-depends: Cabal        >= 1.14    && < 1.26
                              || >= 2.0     && < 2.6
diff --git a/hackage-security/hackage-repo-tool/src/Hackage/Security/RepoTool/Util/IO.hs b/hackage-security/hackage-repo-tool/src/Hackage/Security/RepoTool/Util/IO.hs
--- a/hackage-security/hackage-repo-tool/src/Hackage/Security/RepoTool/Util/IO.hs
+++ b/hackage-security/hackage-repo-tool/src/Hackage/Security/RepoTool/Util/IO.hs
@@ -34,11 +34,7 @@
 import qualified System.Posix.Files                as Posix
 #endif
 
-#if MIN_VERSION_directory(1,2,0)
 import           Data.Time.Clock.POSIX             (utcTimeToPOSIXSeconds)
-#else
-import           System.Time                       (ClockTime (TOD))
-#endif
 
 -- | Get the modification time of the specified file
 --
@@ -50,13 +46,8 @@
       -- from POSIX seconds, so there shouldn't be loss of precision.
       -- NB: Apparently, this has low clock resolution on GHC < 7.8.
       -- I don't think we care.
-#if MIN_VERSION_directory(1,2,0)
       fromInteger . floor . utcTimeToPOSIXSeconds
         <$> Directory.getModificationTime (toFilePath fp)
-#else
-      Directory.getModificationTime (toFilePath fp) >>= \(TOD s _) ->
-        return (fromInteger s)
-#endif
   where
     fp :: Path Absolute
     fp = anchorTargetPath' opts repoLoc targetPath
@@ -123,11 +114,6 @@
   deriving (Typeable)
 
 instance Exception TarGzError where
-#if MIN_VERSION_base(4,8,0)
   displayException (TarGzError path e) = path ++ ": " ++ displayException e
 
 deriving instance Show TarGzError
-#else
-instance Show TarGzError where
-  show (TarGzError path e) = path ++ ": " ++ show e
-#endif
diff --git a/hackage-security/hackage-repo-tool/src/Main.hs b/hackage-security/hackage-repo-tool/src/Main.hs
--- a/hackage-security/hackage-repo-tool/src/Main.hs
+++ b/hackage-security/hackage-repo-tool/src/Main.hs
@@ -77,11 +77,6 @@
     putStrLn $ displayException e
     exitFailure
 
-#if !MIN_VERSION_base(4,8,0)
-displayException :: Exception e => e -> String
-displayException = show
-#endif
-
 {-------------------------------------------------------------------------------
   Creating keys
 -------------------------------------------------------------------------------}
diff --git a/hackage-security/hackage-repo-tool/src/Prelude.hs b/hackage-security/hackage-repo-tool/src/Prelude.hs
deleted file mode 100644
--- a/hackage-security/hackage-repo-tool/src/Prelude.hs
+++ /dev/null
@@ -1,27 +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(..)
-  , (<$>)
-  , (<$)
-  , traverse
-#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 Data.Monoid
-import Data.Traversable (traverse)
-#endif
diff --git a/hackage-security/hackage-root-tool/Main.hs b/hackage-security/hackage-root-tool/Main.hs
--- a/hackage-security/hackage-root-tool/Main.hs
+++ b/hackage-security/hackage-root-tool/Main.hs
@@ -49,11 +49,6 @@
     putStrLn $ displayException e
     exitFailure
 
-#if !MIN_VERSION_base(4,8,0)
-displayException :: Exception e => e -> String
-displayException = show
-#endif
-
 {-------------------------------------------------------------------------------
   Creating keys
 -------------------------------------------------------------------------------}
diff --git a/hackage-security/hackage-root-tool/hackage-root-tool.cabal b/hackage-security/hackage-root-tool/hackage-root-tool.cabal
--- a/hackage-security/hackage-root-tool/hackage-root-tool.cabal
+++ b/hackage-security/hackage-root-tool/hackage-root-tool.cabal
@@ -16,9 +16,17 @@
 cabal-version:       >=1.10
 
 tested-with:
-  GHC==9.4.1, GHC==9.2.4, GHC==9.0.2,
-  GHC==8.10.7, GHC==8.8.4, GHC==8.6.5, GHC==8.4.4, GHC==8.2.2, GHC==8.0.2,
-  GHC==7.10.3, GHC==7.8.4, GHC==7.6.3, GHC==7.4.2
+  GHC == 9.8.1
+  GHC == 9.6.3
+  GHC == 9.4.8
+  GHC == 9.2.8
+  GHC == 9.0.2
+  GHC == 8.10.7
+  GHC == 8.8.4
+  GHC == 8.6.5
+  GHC == 8.4.4
+  GHC == 8.2.2
+  GHC == 8.0.2
 
 extra-source-files:
   ChangeLog.md
@@ -30,7 +38,7 @@
 
 executable hackage-root-tool
   main-is:             Main.hs
-  build-depends:       base                 >= 4.4  && < 5,
+  build-depends:       base                 >= 4.9  && < 5,
                        filepath             >= 1.2  && < 1.5,
                        optparse-applicative >= 0.11 && < 0.18,
                        hackage-security     >= 0.5  && < 0.7
diff --git a/hackage-security/hackage-security-HTTP/ChangeLog.md b/hackage-security/hackage-security-HTTP/ChangeLog.md
--- a/hackage-security/hackage-security-HTTP/ChangeLog.md
+++ b/hackage-security/hackage-security-HTTP/ChangeLog.md
@@ -1,3 +1,8 @@
+Unreleased
+----------
+* Drop support for GHC 7.
+
+
 0.1.1.1
 -------
 * Add support for hackage-security-0.6
diff --git a/hackage-security/hackage-security-HTTP/hackage-security-HTTP.cabal b/hackage-security/hackage-security-HTTP/hackage-security-HTTP.cabal
--- a/hackage-security/hackage-security-HTTP/hackage-security-HTTP.cabal
+++ b/hackage-security/hackage-security-HTTP/hackage-security-HTTP.cabal
@@ -1,7 +1,7 @@
 cabal-version:       1.12
 name:                hackage-security-HTTP
 version:             0.1.1.1
-x-revision:          2
+x-revision:          7
 synopsis:            Hackage security bindings against the HTTP library
 description:         The hackage security library provides a 'HttpLib'
                      abstraction to allow to bind against different HTTP
@@ -18,9 +18,17 @@
 build-type:          Simple
 
 tested-with:
-  GHC==9.4.1, GHC==9.2.4, GHC==9.0.2,
-  GHC==8.10.7, GHC==8.8.4, GHC==8.6.5, GHC==8.4.4, GHC==8.2.2, GHC==8.0.2,
-  GHC==7.10.3, GHC==7.8.4, GHC==7.6.3, GHC==7.4.2
+  GHC == 9.8.1
+  GHC == 9.6.3
+  GHC == 9.4.8
+  GHC == 9.2.8
+  GHC == 9.0.2
+  GHC == 8.10.7
+  GHC == 8.8.4
+  GHC == 8.6.5
+  GHC == 8.4.4
+  GHC == 8.2.2
+  GHC == 8.0.2
 
 extra-source-files:
   ChangeLog.md
@@ -35,8 +43,8 @@
 
 library
   exposed-modules:     Hackage.Security.Client.Repository.HttpLib.HTTP
-  build-depends:       base             >= 4.5       && < 4.18,
-                       bytestring       >= 0.9       && < 0.12,
+  build-depends:       base             >= 4.9       && < 4.20,
+                       bytestring       >= 0.9       && < 0.13,
                        HTTP             >= 4000.2.19 && < 4000.5,
                        mtl              >= 2.1       && < 2.4,
                        zlib             >= 0.5       && < 0.7,
diff --git a/hackage-security/hackage-security-HTTP/src/Hackage/Security/Client/Repository/HttpLib/HTTP.hs b/hackage-security/hackage-security-HTTP/src/Hackage/Security/Client/Repository/HttpLib/HTTP.hs
--- a/hackage-security/hackage-security-HTTP/src/Hackage/Security/Client/Repository/HttpLib/HTTP.hs
+++ b/hackage-security/hackage-security-HTTP/src/Hackage/Security/Client/Repository/HttpLib/HTTP.hs
@@ -133,17 +133,10 @@
 instance Pretty InvalidProxy where
   pretty (InvalidProxy p) = "Invalid proxy " ++ show p
 
-#if MIN_VERSION_base(4,8,0)
 deriving instance Show UnexpectedResponse
 deriving instance Show InvalidProxy
 instance Exception UnexpectedResponse where displayException = pretty
 instance Exception InvalidProxy where displayException = pretty
-#else
-instance Show UnexpectedResponse where show = pretty
-instance Show InvalidProxy where show = pretty
-instance Exception UnexpectedResponse
-instance Exception InvalidProxy
-#endif
 
 {-------------------------------------------------------------------------------
   Additional operations
diff --git a/hackage-security/hackage-security-curl/hackage-security-curl.cabal b/hackage-security/hackage-security-curl/hackage-security-curl.cabal
--- a/hackage-security/hackage-security-curl/hackage-security-curl.cabal
+++ b/hackage-security/hackage-security-curl/hackage-security-curl.cabal
@@ -16,9 +16,17 @@
 cabal-version:       >=1.10
 
 tested-with:
-  GHC==9.4.1, GHC==9.2.4, GHC==9.0.2,
-  GHC==8.10.7, GHC==8.8.4, GHC==8.6.5, GHC==8.4.4, GHC==8.2.2, GHC==8.0.2,
-  GHC==7.10.3, GHC==7.8.4, GHC==7.6.3, GHC==7.4.2
+  GHC == 9.8.1
+  GHC == 9.6.3
+  GHC == 9.4.8
+  GHC == 9.2.8
+  GHC == 9.0.2
+  GHC == 8.10.7
+  GHC == 8.8.4
+  GHC == 8.6.5
+  GHC == 8.4.4
+  GHC == 8.2.2
+  GHC == 8.0.2
 
 flag use-network-uri
   description: Are we using network-uri?
@@ -26,7 +34,7 @@
 
 library
   exposed-modules:     Hackage.Security.Client.Repository.HttpLib.Curl
-  build-depends:       base        >= 4.5 && < 4.18,
+  build-depends:       base        >= 4.9 && < 4.20,
                        bytestring  >= 0.9,
                        process     >= 1.1,
                        hackage-security
diff --git a/hackage-security/hackage-security-http-client/ChangeLog.md b/hackage-security/hackage-security-http-client/ChangeLog.md
--- a/hackage-security/hackage-security-http-client/ChangeLog.md
+++ b/hackage-security/hackage-security-http-client/ChangeLog.md
@@ -1,3 +1,7 @@
+Unreleased
+----------
+* Drop support for GHC 7.
+
 0.1.1
 -----
 * Implement updated HttpLib API from hackage-security 0.5
diff --git a/hackage-security/hackage-security-http-client/hackage-security-http-client.cabal b/hackage-security/hackage-security-http-client/hackage-security-http-client.cabal
--- a/hackage-security/hackage-security-http-client/hackage-security-http-client.cabal
+++ b/hackage-security/hackage-security-http-client/hackage-security-http-client.cabal
@@ -15,9 +15,17 @@
 cabal-version:       >=1.10
 
 tested-with:
-  GHC==9.4.1, GHC==9.2.4, GHC==9.0.2,
-  GHC==8.10.7, GHC==8.8.4, GHC==8.6.5, GHC==8.4.4, GHC==8.2.2, GHC==8.0.2,
-  GHC==7.10.3, GHC==7.8.4, GHC==7.6.3, GHC==7.4.2
+  GHC == 9.8.1
+  GHC == 9.6.3
+  GHC == 9.4.8
+  GHC == 9.2.8
+  GHC == 9.0.2
+  GHC == 8.10.7
+  GHC == 8.8.4
+  GHC == 8.6.5
+  GHC == 8.4.4
+  GHC == 8.2.2
+  GHC == 8.0.2
 
 flag use-network-uri
   description: Are we using network-uri?
@@ -25,7 +33,7 @@
 
 library
   exposed-modules:     Hackage.Security.Client.Repository.HttpLib.HttpClient
-  build-depends:       base               >= 4.5 && < 4.18,
+  build-depends:       base               >= 4.9 && < 4.20,
                        bytestring         >= 0.9,
                        http-client        >= 0.4 && < 0.8,
                        http-types         >= 0.8,
diff --git a/hackage-security/hackage-security/ChangeLog.md b/hackage-security/hackage-security/ChangeLog.md
--- a/hackage-security/hackage-security/ChangeLog.md
+++ b/hackage-security/hackage-security/ChangeLog.md
@@ -1,5 +1,19 @@
 See also http://pvp.haskell.org/faq
 
+Unreleased
+----------
+
+* Drop support for GHC 7.
+* Drop flag `use-old-time` and support for `old-time`, require `time ≥ 1.5`.
+
+0.6.2.4
+-------
+
+* Allow `tar-0.6`
+* Drop support for GHC < 7.8 in favor of `PatternSynonyms`
+* Drop flags `base48`, `mtl21`, `old-directory` and support for GHC 7.8, `mtl < 2.2` and `directory < 1.2`
+* Tested with GHC 7.10 - 9.8
+
 0.6.2.3
 -------
 
diff --git a/hackage-security/hackage-security/hackage-security.cabal b/hackage-security/hackage-security/hackage-security.cabal
--- a/hackage-security/hackage-security/hackage-security.cabal
+++ b/hackage-security/hackage-security/hackage-security.cabal
@@ -1,6 +1,6 @@
 cabal-version:       1.12
 name:                hackage-security
-version:             0.6.2.3
+version:             0.6.2.4
 
 synopsis:            Hackage security library
 description:         The hackage security library provides both server and
@@ -31,9 +31,17 @@
 build-type:          Simple
 
 tested-with:
-  GHC==9.4.1, GHC==9.2.4, GHC==9.0.2,
-  GHC==8.10.7, GHC==8.8.4, GHC==8.6.5, GHC==8.4.4, GHC==8.2.2, GHC==8.0.2,
-  GHC==7.10.3, GHC==7.8.4, GHC==7.6.3, GHC==7.4.2
+  GHC == 9.8.1
+  GHC == 9.6.3
+  GHC == 9.4.8
+  GHC == 9.2.8
+  GHC == 9.0.2
+  GHC == 8.10.7
+  GHC == 8.8.4
+  GHC == 8.6.5
+  GHC == 8.4.4
+  GHC == 8.2.2
+  GHC == 8.0.2
 
 extra-source-files:
   ChangeLog.md
@@ -42,10 +50,6 @@
   type: git
   location: https://github.com/haskell/hackage-security.git
 
-flag base48
-  description: Are we using @base@ 4.8 or later?
-  manual: False
-
 flag use-network-uri
   description: Are we using @network-uri@?
   manual: False
@@ -55,16 +59,6 @@
   manual: False
   default: False
 
-flag old-directory
-  description: Use @directory@ < 1.2 and @old-time@
-  manual:      False
-  default:     False
-
-flag mtl21
-  description: Use @mtl@ < 2.2 and @mtl-compat@
-  manual:      False
-  default:     False
-
 flag lukko
   description: Use @lukko@ for file-locking, otherwise use @GHC.IO.Handle.Lock@
   manual:      True
@@ -115,46 +109,36 @@
                        Hackage.Security.Util.Lens
                        Hackage.Security.Util.Stack
                        Hackage.Security.Util.TypedEmbedded
-                       MyPrelude
-  -- We support ghc 7.4 (bundled with Cabal 1.14) and up
-  build-depends:       base              >= 4.5     && < 4.18,
+
+  build-depends:       base              >= 4.9     && < 4.20,
                        base16-bytestring >= 0.1.1   && < 1.1,
                        base64-bytestring >= 1.0     && < 1.3,
-                       bytestring        >= 0.9     && < 0.12,
-                       containers        >= 0.4     && < 0.7,
+                       bytestring        >= 0.9     && < 0.13,
+                       containers        >= 0.4     && < 0.8,
+                       cryptohash-sha256 >= 0.11    && < 0.12,
+                       directory         >= 1.2.2   && < 1.4,
                        ed25519           >= 0.0     && < 0.1,
                        filepath          >= 1.2     && < 1.5,
+                       mtl               >= 2.2     && < 2.4,
                        parsec            >= 3.1     && < 3.2,
                        pretty            >= 1.0     && < 1.2,
-                       cryptohash-sha256 >= 0.11    && < 0.12,
                        -- 0.4.2 introduces TarIndex, 0.4.4 introduces more
                        -- functionality, 0.5.0 changes type of serialise
-                       tar               >= 0.5     && < 0.6,
-                       template-haskell  >= 2.7     && < 2.20,
-                       time              >= 1.2     && < 1.13,
+                       tar               >= 0.5     && < 0.7,
+                       template-haskell  >= 2.7     && < 2.22,
+                       time              >= 1.5     && < 1.13,
                        transformers      >= 0.3     && < 0.7,
                        zlib              >= 0.5     && < 0.7,
                        -- whatever versions are bundled with ghc:
                        ghc-prim
-  if flag(old-directory)
-    build-depends:     directory  >= 1.1.0.2 && < 1.2,
-                       old-time   >= 1 &&       < 1.2
-  else
-    build-depends:     directory  >= 1.2 && < 1.4
 
-  if flag(mtl21)
-    build-depends:     mtl        >= 2.1     && < 2.2,
-                       mtl-compat >= 0.2     && < 0.3
-  else
-    build-depends:     mtl        >= 2.2     && < 2.4
-
   if flag(lukko)
     build-depends:     lukko      >= 0.1     && < 0.2
   else
     build-depends:     base       >= 4.10
 
   if flag(Cabal-syntax) && impl(ghc >= 8.2)
-    build-depends: Cabal-syntax >= 3.7 && < 3.10
+    build-depends: Cabal-syntax >= 3.7 && < 3.12
   else
     build-depends: Cabal        >= 1.14    && < 1.26
                              || >= 2.0     && < 2.6
@@ -175,6 +159,7 @@
                        NamedFieldPuns
                        NoImplicitPrelude
                        NoMonomorphismRestriction
+                       PatternSynonyms
                        RankNTypes
                        RecordWildCards
                        ScopedTypeVariables
@@ -183,25 +168,19 @@
                        TypeFamilies
                        TypeOperators
                        ViewPatterns
-  other-extensions:    BangPatterns
+  other-extensions:
+                       AllowAmbiguousTypes
+                       BangPatterns
                        CPP
+                       DeriveLift
                        OverlappingInstances
                        PackageImports
+                       RoleAnnotations
+                       StaticPointers
                        UndecidableInstances
 
-  -- use the new stage1/cross-compile-friendly DeriveLift extension for GHC 8.0+
-  if impl(ghc >= 8.0)
-    other-extensions: DeriveLift
-  else
-    other-extensions: TemplateHaskell
-
   ghc-options:         -Wall
 
-  if flag(base48)
-    build-depends: base >= 4.8
-  else
-    build-depends: base < 4.8, old-locale == 1.0.*
-
   -- The URI type got split out off the network package after version 2.5, and
   -- moved to a separate network-uri package. Since we don't need the rest of
   -- network here, it would suffice to rely only on network-uri:
@@ -241,13 +220,6 @@
   else
     build-depends: network     >= 2.5 && < 2.6
 
-  if impl(ghc >= 7.8)
-     other-extensions: RoleAnnotations
-
-  if impl(ghc >= 7.10)
-     other-extensions: AllowAmbiguousTypes
-                       StaticPointers
-
 test-suite TestSuite
   type:                exitcode-stdio-1.0
   main-is:             TestSuite.hs
@@ -271,8 +243,8 @@
                        zlib
 
   if flag(Cabal-syntax) && impl(ghc >= 8.2)
-    build-depends: Cabal        >= 3.7 && < 3.10,
-                   Cabal-syntax >= 3.7 && < 3.10
+    build-depends: Cabal        >= 3.7 && < 3.12,
+                   Cabal-syntax >= 3.7 && < 3.12
   else
     build-depends: Cabal        >= 1.14    && < 1.26
                              || >= 2.0     && < 2.6
@@ -280,11 +252,11 @@
                    Cabal-syntax <  3.7
 
   -- dependencies exclusive to test-suite
-  build-depends:       tasty            >= 1.2 && < 1.5,
+  build-depends:       tasty            >= 1.2 && < 1.6,
                        tasty-hunit      == 0.10.*,
                        tasty-quickcheck == 0.10.*,
                        QuickCheck       >= 2.11 && <2.15,
-                       aeson            == 1.4.* || == 1.5.* || == 2.0.* || == 2.1.*,
+                       aeson            >= 1.4 && < 1.6 || >= 2.0 && < 2.3,
                        vector           >= 0.12 && <0.14,
                        unordered-containers >=0.2.8.0 && <0.3,
                        temporary        >= 1.2 && < 1.4
diff --git a/hackage-security/hackage-security/src/Hackage/Security/Client.hs b/hackage-security/hackage-security/src/Hackage/Security/Client.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/Client.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/Client.hs
@@ -1,7 +1,6 @@
 {-# LANGUAGE CPP #-}
-#if __GLASGOW_HASKELL__ >= 710
 {-# LANGUAGE StaticPointers #-}
-#endif
+
 -- | Main entry point into the Hackage Security framework for clients
 module Hackage.Security.Client (
     -- * Checking for updates
@@ -41,7 +40,7 @@
   , LocalFileCorrupted(..)
   ) where
 
-import MyPrelude hiding (log)
+import Prelude hiding (log)
 import Control.Arrow (first)
 import Control.Exception
 import Control.Monad
@@ -333,11 +332,7 @@
 
 -- | Get all cached info (if any)
 getCachedInfo ::
-#if __GLASGOW_HASKELL__ < 800
-                 (Applicative m, MonadIO m)
-#else
                  MonadIO m
-#endif
               => Repository down -> m CachedInfo
 getCachedInfo rep = do
     (cachedRoot, cachedKeyEnv) <- readLocalRoot rep
@@ -360,9 +355,6 @@
     return (trustLocalFile signedRoot, rootKeys (signed signedRoot))
 
 readLocalFile :: ( FromJSON ReadJSON_Keys_Layout (Signed a), MonadIO m
-#if __GLASGOW_HASKELL__ < 800
-                 , Applicative m
-#endif
                  )
               => Repository down -> KeyEnv -> CachedFile -> m (Maybe (Trusted a))
 readLocalFile rep cachedKeyEnv file = do
@@ -952,21 +944,12 @@
   }
   deriving (Typeable)
 
-#if MIN_VERSION_base(4,8,0)
 deriving instance Show InvalidPackageException
 deriving instance Show LocalFileCorrupted
 deriving instance Show InvalidFileInIndex
 instance Exception InvalidPackageException where displayException = pretty
 instance Exception LocalFileCorrupted where displayException = pretty
 instance Exception InvalidFileInIndex where displayException = pretty
-#else
-instance Show InvalidPackageException where show = pretty
-instance Show LocalFileCorrupted where show = pretty
-instance Show InvalidFileInIndex where show = pretty
-instance Exception InvalidPackageException
-instance Exception LocalFileCorrupted
-instance Exception InvalidFileInIndex
-#endif
 
 instance Pretty InvalidPackageException where
   pretty (InvalidPackageException pkgId) = "Invalid package " ++ display pkgId
diff --git a/hackage-security/hackage-security/src/Hackage/Security/Client/Formats.hs b/hackage-security/hackage-security/src/Hackage/Security/Client/Formats.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/Client/Formats.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/Client/Formats.hs
@@ -17,7 +17,7 @@
   , formatsLookup
   ) where
 
-import MyPrelude
+import Prelude
 import Hackage.Security.Util.Stack
 import Hackage.Security.Util.TypedEmbedded
 
diff --git a/hackage-security/hackage-security/src/Hackage/Security/Client/Repository.hs b/hackage-security/hackage-security/src/Hackage/Security/Client/Repository.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/Client/Repository.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/Client/Repository.hs
@@ -30,7 +30,7 @@
   , mustCache
   ) where
 
-import MyPrelude
+import Prelude
 import Control.Exception
 import Data.Typeable (Typeable)
 import qualified Codec.Archive.Tar.Index as Tar
@@ -385,13 +385,8 @@
     SomeRemoteError :: Exception e => e -> SomeRemoteError
   deriving (Typeable)
 
-#if MIN_VERSION_base(4,8,0)
 deriving instance Show SomeRemoteError
 instance Exception SomeRemoteError where displayException = pretty
-#else
-instance Exception SomeRemoteError
-instance Show SomeRemoteError where show = pretty
-#endif
 
 instance Pretty SomeRemoteError where
     pretty (SomeRemoteError ex) = displayException ex
diff --git a/hackage-security/hackage-security/src/Hackage/Security/Client/Repository/Cache.hs b/hackage-security/hackage-security/src/Hackage/Security/Client/Repository/Cache.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/Client/Repository/Cache.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/Client/Repository/Cache.hs
@@ -15,12 +15,12 @@
   , lockCacheWithLogger
   ) where
 
-import MyPrelude
+import Prelude
 import Control.Exception
 import Control.Monad
 import Control.Monad.IO.Class
 import Data.Maybe
-import Codec.Archive.Tar (Entries(..))
+import Codec.Archive.Tar (Entries, pattern Done, pattern Fail, pattern Next)
 import Codec.Archive.Tar.Index (TarIndex, IndexBuilder, TarEntryOffset)
 import qualified Codec.Archive.Tar       as Tar
 import qualified Codec.Archive.Tar.Index as TarIndex
diff --git a/hackage-security/hackage-security/src/Hackage/Security/Client/Repository/HttpLib.hs b/hackage-security/hackage-security/src/Hackage/Security/Client/Repository/HttpLib.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/Client/Repository/HttpLib.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/Client/Repository/HttpLib.hs
@@ -11,7 +11,7 @@
   , bodyReaderFromBS
   ) where
 
-import MyPrelude
+import Prelude
 import Data.IORef
 import Network.URI hiding (uriPath, path)
 import qualified Data.ByteString      as BS
diff --git a/hackage-security/hackage-security/src/Hackage/Security/Client/Repository/Local.hs b/hackage-security/hackage-security/src/Hackage/Security/Client/Repository/Local.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/Client/Repository/Local.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/Client/Repository/Local.hs
@@ -5,7 +5,7 @@
   , withRepository
   ) where
 
-import MyPrelude
+import Prelude
 import Hackage.Security.Client.Formats
 import Hackage.Security.Client.Repository
 import Hackage.Security.Client.Repository.Cache
diff --git a/hackage-security/hackage-security/src/Hackage/Security/Client/Repository/Remote.hs b/hackage-security/hackage-security/src/Hackage/Security/Client/Repository/Remote.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/Client/Repository/Remote.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/Client/Repository/Remote.hs
@@ -27,7 +27,7 @@
   , fileSizeWithinBounds
   ) where
 
-import MyPrelude
+import Prelude
 import Control.Concurrent
 import Control.Exception
 import Control.Monad (when, unless)
@@ -498,13 +498,8 @@
       expected (FileSizeExact n) = "exactly " ++ show n
       expected (FileSizeBound n) = "at most " ++ show n
 
-#if MIN_VERSION_base(4,8,0)
 deriving instance Show FileTooLarge
 instance Exception FileTooLarge where displayException = pretty
-#else
-instance Exception FileTooLarge
-instance Show FileTooLarge where show = pretty
-#endif
 
 {-------------------------------------------------------------------------------
   Information about remote files
@@ -687,4 +682,3 @@
                 BS.L.take (fromIntegral deltaSeek) existing
               , temp
               ]
-
diff --git a/hackage-security/hackage-security/src/Hackage/Security/Client/Verify.hs b/hackage-security/hackage-security/src/Hackage/Security/Client/Verify.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/Client/Verify.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/Client/Verify.hs
@@ -10,7 +10,7 @@
   , liftIO
   ) where
 
-import MyPrelude
+import Prelude
 import Control.Exception
 import Control.Monad (join, void)
 import Control.Monad.IO.Class (MonadIO, liftIO)
diff --git a/hackage-security/hackage-security/src/Hackage/Security/JSON.hs b/hackage-security/hackage-security/src/Hackage/Security/JSON.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/JSON.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/JSON.hs
@@ -38,7 +38,7 @@
   , module Hackage.Security.Util.JSON
   ) where
 
-import MyPrelude
+import Prelude
 import Control.Arrow (first, second)
 import Control.Exception
 import Control.Monad (unless, liftM)
@@ -84,13 +84,8 @@
   | DeserializationErrorFileType String String
   deriving (Typeable)
 
-#if MIN_VERSION_base(4,8,0)
 deriving instance Show DeserializationError
 instance Exception DeserializationError where displayException = pretty
-#else
-instance Show DeserializationError where show = pretty
-instance Exception DeserializationError
-#endif
 
 instance Pretty DeserializationError where
   pretty (DeserializationErrorMalformed str) =
diff --git a/hackage-security/hackage-security/src/Hackage/Security/Key.hs b/hackage-security/hackage-security/src/Hackage/Security/Key.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/Key.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/Key.hs
@@ -25,7 +25,7 @@
   , verify
   ) where
 
-import MyPrelude
+import Prelude
 import Control.Monad
 import Data.Functor.Identity
 import Data.Typeable (Typeable)
@@ -37,10 +37,6 @@
 import qualified Data.ByteString.Base16 as Base16
 import qualified Data.ByteString.Lazy as BS.L
 
-#if !MIN_VERSION_base(4,7,0)
-import qualified Data.Typeable as Typeable
-#endif
-
 import Hackage.Security.Util.JSON
 import Hackage.Security.Util.Some
 import Hackage.Security.Util.TypedEmbedded
@@ -277,26 +273,3 @@
     case tag of
       "ed25519"  -> return . Some $ KeyTypeEd25519
       _otherwise -> expected "valid key type" (Just tag)
-
-{-------------------------------------------------------------------------------
-  Orphans
-
-  Pre-7.8 (base 4.7) we cannot have Typeable instance for higher-kinded types.
-  Instead, here we provide some instance for specific instantiations.
--------------------------------------------------------------------------------}
-
-#if !MIN_VERSION_base(4,7,0)
-tyConKey, tyConPublicKey, tyConPrivateKey :: Typeable.TyCon
-tyConKey        = Typeable.mkTyCon3 "hackage-security" "Hackage.Security.Key" "Key"
-tyConPublicKey  = Typeable.mkTyCon3 "hackage-security" "Hackage.Security.Key" "PublicKey"
-tyConPrivateKey = Typeable.mkTyCon3 "hackage-security" "Hackage.Security.Key" "PrivateKey"
-
-instance Typeable (Some Key) where
-  typeOf _ = Typeable.mkTyConApp tyConSome [Typeable.mkTyConApp tyConKey []]
-
-instance Typeable (Some PublicKey) where
-  typeOf _ = Typeable.mkTyConApp tyConSome [Typeable.mkTyConApp tyConPublicKey []]
-
-instance Typeable (Some PrivateKey) where
-  typeOf _ = Typeable.mkTyConApp tyConSome [Typeable.mkTyConApp tyConPrivateKey []]
-#endif
diff --git a/hackage-security/hackage-security/src/Hackage/Security/Key/Env.hs b/hackage-security/hackage-security/src/Hackage/Security/Key/Env.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/Key/Env.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/Key/Env.hs
@@ -12,7 +12,7 @@
   , union
   ) where
 
-import MyPrelude hiding (lookup, null)
+import Prelude hiding (lookup, null)
 import Control.Monad
 import Data.Map (Map)
 import qualified Data.Map as Map
diff --git a/hackage-security/hackage-security/src/Hackage/Security/TUF/Common.hs b/hackage-security/hackage-security/src/Hackage/Security/TUF/Common.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/TUF/Common.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/TUF/Common.hs
@@ -6,7 +6,7 @@
   , KeyThreshold(..)
   ) where
 
-import MyPrelude
+import Prelude
 import Hackage.Security.JSON
 
 {-------------------------------------------------------------------------------
diff --git a/hackage-security/hackage-security/src/Hackage/Security/TUF/FileInfo.hs b/hackage-security/hackage-security/src/Hackage/Security/TUF/FileInfo.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/TUF/FileInfo.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/TUF/FileInfo.hs
@@ -13,7 +13,7 @@
   , Int54
   ) where
 
-import MyPrelude hiding (lookup)
+import Prelude hiding (lookup)
 import Data.Map (Map)
 import qualified Crypto.Hash.SHA256   as SHA256
 import qualified Data.Map             as Map
diff --git a/hackage-security/hackage-security/src/Hackage/Security/TUF/FileMap.hs b/hackage-security/hackage-security/src/Hackage/Security/TUF/FileMap.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/TUF/FileMap.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/TUF/FileMap.hs
@@ -18,7 +18,7 @@
   , fileMapChanges
   ) where
 
-import MyPrelude hiding (lookup)
+import Prelude hiding (lookup)
 import Control.Arrow (second)
 import Data.Map (Map)
 import qualified Data.Map as Map
diff --git a/hackage-security/hackage-security/src/Hackage/Security/TUF/Header.hs b/hackage-security/hackage-security/src/Hackage/Security/TUF/Header.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/TUF/Header.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/TUF/Header.hs
@@ -12,7 +12,7 @@
   , versionIncrement
   ) where
 
-import MyPrelude
+import Prelude
 import Data.Time
 import Data.Typeable (Typeable)
 
diff --git a/hackage-security/hackage-security/src/Hackage/Security/TUF/Layout/Cache.hs b/hackage-security/hackage-security/src/Hackage/Security/TUF/Layout/Cache.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/TUF/Layout/Cache.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/TUF/Layout/Cache.hs
@@ -4,7 +4,7 @@
   , cabalCacheLayout
   ) where
 
-import MyPrelude
+import Prelude
 import Hackage.Security.TUF.Paths
 import Hackage.Security.Util.Path
 
diff --git a/hackage-security/hackage-security/src/Hackage/Security/TUF/Layout/Index.hs b/hackage-security/hackage-security/src/Hackage/Security/TUF/Layout/Index.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/TUF/Layout/Index.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/TUF/Layout/Index.hs
@@ -9,7 +9,7 @@
   , indexLayoutPkgPrefs
   ) where
 
-import MyPrelude
+import Prelude
 import Distribution.Package
 import Distribution.Text
 
diff --git a/hackage-security/hackage-security/src/Hackage/Security/TUF/Layout/Repo.hs b/hackage-security/hackage-security/src/Hackage/Security/TUF/Layout/Repo.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/TUF/Layout/Repo.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/TUF/Layout/Repo.hs
@@ -5,7 +5,7 @@
   , cabalLocalRepoLayout
   ) where
 
-import MyPrelude
+import Prelude
 import Distribution.Package
 import Distribution.Text
 
diff --git a/hackage-security/hackage-security/src/Hackage/Security/TUF/Mirrors.hs b/hackage-security/hackage-security/src/Hackage/Security/TUF/Mirrors.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/TUF/Mirrors.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/TUF/Mirrors.hs
@@ -9,7 +9,7 @@
   , describeMirror
   ) where
 
-import MyPrelude
+import Prelude
 import Control.Monad.Except
 import Network.URI
 
diff --git a/hackage-security/hackage-security/src/Hackage/Security/TUF/Paths.hs b/hackage-security/hackage-security/src/Hackage/Security/TUF/Paths.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/TUF/Paths.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/TUF/Paths.hs
@@ -14,7 +14,7 @@
   , anchorCachePath
   ) where
 
-import MyPrelude
+import Prelude
 import Hackage.Security.Util.Path
 import Hackage.Security.Util.Pretty
 
diff --git a/hackage-security/hackage-security/src/Hackage/Security/TUF/Patterns.hs b/hackage-security/hackage-security/src/Hackage/Security/TUF/Patterns.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/TUF/Patterns.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/TUF/Patterns.hs
@@ -3,12 +3,9 @@
 -- NOTE: This module was developed to prepare for proper delegation (#39).
 -- It is currently unused.
 {-# LANGUAGE CPP #-}
-#if __GLASGOW_HASKELL__ >= 800
 {-# LANGUAGE DeriveLift #-}
 {-# LANGUAGE StandaloneDeriving #-}
-#else
-{-# LANGUAGE TemplateHaskell #-}
-#endif
+
 module Hackage.Security.TUF.Patterns (
     -- * Patterns and replacements
     FileName
@@ -26,7 +23,7 @@
   , qqd
   ) where
 
-import MyPrelude
+import Prelude
 import Control.Monad (guard)
 import Language.Haskell.TH (Q, Exp)
 import System.FilePath.Posix
@@ -274,28 +271,9 @@
       Left  err -> fail $ "Invalid delegation: " ++ err
       Right del -> TH.lift del
 
-#if __GLASGOW_HASKELL__ >= 800
 deriving instance TH.Lift (Pattern a)
 deriving instance TH.Lift (Replacement a)
 deriving instance TH.Lift Delegation
-#else
-instance TH.Lift (Pattern a) where
-  lift (PatFileConst fn)  = [| PatFileConst fn  |]
-  lift (PatFileExt   e)   = [| PatFileExt   e   |]
-  lift PatFileAny         = [| PatFileAny       |]
-  lift (PatDirConst  d p) = [| PatDirConst  d p |]
-  lift (PatDirAny      p) = [| PatDirAny      p |]
-
-instance TH.Lift (Replacement a) where
-  lift (RepFileConst fn)  = [| RepFileConst fn  |]
-  lift (RepFileExt   e )  = [| RepFileExt   e   |]
-  lift RepFileAny         = [| RepFileAny       |]
-  lift (RepDirConst  d r) = [| RepDirConst  d r |]
-  lift (RepDirAny      r) = [| RepDirAny      r |]
-
-instance TH.Lift Delegation where
-  lift (Delegation pat repl) = [| Delegation pat repl |]
-#endif
 
 {-------------------------------------------------------------------------------
   JSON
diff --git a/hackage-security/hackage-security/src/Hackage/Security/TUF/Root.hs b/hackage-security/hackage-security/src/Hackage/Security/TUF/Root.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/TUF/Root.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/TUF/Root.hs
@@ -6,7 +6,7 @@
   , RoleSpec(..)
   ) where
 
-import MyPrelude
+import Prelude
 import Hackage.Security.JSON
 import Hackage.Security.Key
 import Hackage.Security.Key.Env (KeyEnv)
diff --git a/hackage-security/hackage-security/src/Hackage/Security/TUF/Signed.hs b/hackage-security/hackage-security/src/Hackage/Security/TUF/Signed.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/TUF/Signed.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/TUF/Signed.hs
@@ -27,7 +27,7 @@
   , toPreSignatures
   ) where
 
-import MyPrelude
+import Prelude
 import Control.Monad
 import Data.Functor.Identity
 import qualified Data.ByteString      as BS
diff --git a/hackage-security/hackage-security/src/Hackage/Security/TUF/Snapshot.hs b/hackage-security/hackage-security/src/Hackage/Security/TUF/Snapshot.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/TUF/Snapshot.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/TUF/Snapshot.hs
@@ -3,7 +3,7 @@
     Snapshot(..)
   ) where
 
-import MyPrelude
+import Prelude
 import Control.Monad.Except
 import Control.Monad.Reader
 
diff --git a/hackage-security/hackage-security/src/Hackage/Security/TUF/Targets.hs b/hackage-security/hackage-security/src/Hackage/Security/TUF/Targets.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/TUF/Targets.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/TUF/Targets.hs
@@ -8,7 +8,7 @@
   , targetsLookup
   ) where
 
-import MyPrelude
+import Prelude
 import Hackage.Security.JSON
 import Hackage.Security.Key
 import Hackage.Security.Key.Env (KeyEnv)
diff --git a/hackage-security/hackage-security/src/Hackage/Security/TUF/Timestamp.hs b/hackage-security/hackage-security/src/Hackage/Security/TUF/Timestamp.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/TUF/Timestamp.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/TUF/Timestamp.hs
@@ -3,7 +3,7 @@
     Timestamp(..)
   ) where
 
-import MyPrelude
+import Prelude
 import Control.Monad.Except
 import Control.Monad.Reader
 
diff --git a/hackage-security/hackage-security/src/Hackage/Security/Trusted.hs b/hackage-security/hackage-security/src/Hackage/Security/Trusted.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/Trusted.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/Trusted.hs
@@ -1,7 +1,6 @@
 {-# LANGUAGE CPP #-}
-#if __GLASGOW_HASKELL__ >= 710
 {-# LANGUAGE StaticPointers #-}
-#endif
+
 module Hackage.Security.Trusted (
     module Hackage.Security.Trusted.TCB
     -- * Derived functions
@@ -12,7 +11,7 @@
   , trustedFileInfoEqual
   ) where
 
-import MyPrelude
+import Prelude
 import Data.Function (on)
 import Data.Time
 import Hackage.Security.TUF
diff --git a/hackage-security/hackage-security/src/Hackage/Security/Trusted/TCB.hs b/hackage-security/hackage-security/src/Hackage/Security/Trusted/TCB.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/Trusted/TCB.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/Trusted/TCB.hs
@@ -16,17 +16,11 @@
   , signaturesVerified
   , verifyRole'
   , verifyFingerprints
-#if __GLASGOW_HASKELL__ >= 710
     -- * Re-exports
   , StaticPtr
-#else
-    -- * Fake static pointers
-  , StaticPtr
-  , static
-#endif
   ) where
 
-import MyPrelude
+import Prelude
 import Control.Exception
 import Control.Monad (when, unless)
 import Control.Monad.Except (Except, runExcept, throwError)
@@ -38,18 +32,8 @@
 import Hackage.Security.Util.Pretty
 import qualified Hackage.Security.Util.Lens as Lens
 
-#if __GLASGOW_HASKELL__ >= 710
 import GHC.StaticPtr
-#else
--- Fake static pointers for ghc < 7.10. This means Trusted offers no
--- additional type safety, but that's okay: we can still verify the code
--- with ghc 7.10 and get the additional checks.
-newtype StaticPtr a = StaticPtr { deRefStaticPtr :: a }
 
-static :: a -> StaticPtr a
-static = StaticPtr
-#endif
-
 -- | Trusted values
 --
 -- Trusted values originate in only two ways:
@@ -167,7 +151,10 @@
 -- | Errors thrown during role validation
 data VerificationError =
      -- | Not enough signatures signed with the appropriate keys
-     VerificationErrorSignatures TargetPath
+     VerificationErrorSignatures TargetPath -- what were we verifying?
+                                 Integer    -- threshold
+                                 [KeyId]    -- trusted keys
+                                 [KeyId]    -- found signing keys
 
      -- | The file is expired
    | VerificationErrorExpired TargetPath
@@ -206,21 +193,21 @@
 
 type VerificationHistory = [Either RootUpdated VerificationError]
 
-#if MIN_VERSION_base(4,8,0)
 deriving instance Show VerificationError
 deriving instance Show RootUpdated
 instance Exception VerificationError where displayException = pretty
 instance Exception RootUpdated where displayException = pretty
-#else
-instance Exception VerificationError
-instance Show VerificationError where show = pretty
-instance Show RootUpdated where show = pretty
-instance Exception RootUpdated
-#endif
 
+indentedLines :: [String] -> String
+indentedLines = unlines . map ("  " ++)
+
 instance Pretty VerificationError where
-  pretty (VerificationErrorSignatures file) =
-      pretty file ++ " does not have enough signatures signed with the appropriate keys"
+  pretty (VerificationErrorSignatures file threshold trusted sigs) =
+      pretty file ++ " does not have enough signatures signed with the appropriate keys\n"
+   ++ "Expected at least " ++ show threshold  ++ " signatures from:\n"
+   ++ indentedLines (map keyIdString trusted)
+   ++ "Found signatures from:\n"
+   ++ indentedLines (map keyIdString sigs)
   pretty (VerificationErrorExpired file) =
       pretty file ++ " is expired"
   pretty (VerificationErrorVersion file) =
@@ -235,7 +222,7 @@
       "Could not deserialize " ++ pretty file ++ ": " ++ pretty err
   pretty (VerificationErrorLoop es) =
       "Verification loop. Errors in order:\n"
-   ++ unlines (map (("  " ++) . either pretty pretty) es)
+   ++ indentedLines (map (either pretty pretty) es)
 
 instance Pretty RootUpdated where
   pretty RootUpdated = "Root information updated"
@@ -291,8 +278,9 @@
       -- was invalid we would already have thrown an error constructing Signed.
       -- (Similarly, if two signatures were made by the same key, the FromJSON
       -- instance for Signatures would have thrown an error.)
-      unless (length (filter isRoleSpecKey sigs) >= fromIntegral threshold) $
-        throwError $ VerificationErrorSignatures targetPath
+      let nSigs = length (filter isRoleSpecKey sigs)
+      unless (nSigs >= fromIntegral threshold) $
+        throwError $ VerificationErrorSignatures targetPath (fromIntegral threshold) trustedKeys signingKeys
 
       -- Everything is A-OK!
       return $ SignaturesVerified signed
@@ -300,6 +288,10 @@
     isRoleSpecKey :: Signature -> Bool
     isRoleSpecKey Signature{..} = signatureKey `elem` roleSpecKeys
 
+    trustedKeys, signingKeys :: [KeyId]
+    trustedKeys = map someKeyId roleSpecKeys
+    signingKeys = map (someKeyId . signatureKey) sigs
+
 -- | Variation on 'verifyRole' that uses key IDs rather than keys
 --
 -- This is used during the bootstrap process.
@@ -314,9 +306,12 @@
                    (KeyThreshold threshold)
                    targetPath
                    Signed{signatures = Signatures sigs, ..} =
-    if length (filter isTrustedKey sigs) >= fromIntegral threshold
+    if length (filter isTrustedKey signingKeys) >= fromIntegral threshold
       then Right $ SignaturesVerified signed
-      else Left $ VerificationErrorSignatures targetPath
+      else Left $ VerificationErrorSignatures targetPath (fromIntegral threshold) fingerprints signingKeys
   where
-    isTrustedKey :: Signature -> Bool
-    isTrustedKey Signature{..} = someKeyId signatureKey `elem` fingerprints
+    signingKeys :: [KeyId]
+    signingKeys = map (someKeyId . signatureKey) sigs
+
+    isTrustedKey :: KeyId -> Bool
+    isTrustedKey key = key `elem` fingerprints
diff --git a/hackage-security/hackage-security/src/Hackage/Security/Util/Base64.hs b/hackage-security/hackage-security/src/Hackage/Security/Util/Base64.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/Util/Base64.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/Util/Base64.hs
@@ -4,7 +4,7 @@
   , toByteString
   ) where
 
-import MyPrelude
+import Prelude
 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/hackage-security/hackage-security/src/Hackage/Security/Util/Checked.hs b/hackage-security/hackage-security/src/Hackage/Security/Util/Checked.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/Util/Checked.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/Util/Checked.hs
@@ -1,15 +1,10 @@
 {-# LANGUAGE CPP #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds #-}
-#if __GLASGOW_HASKELL__ >= 800
-{-# OPTIONS_GHC -Wno-redundant-constraints #-}
-#endif
-
-#if __GLASGOW_HASKELL__ >= 708
-{-# LANGUAGE RoleAnnotations     #-}
+{-# LANGUAGE DeriveDataTypeable  #-}
 {-# LANGUAGE IncoherentInstances #-}
-#endif
+{-# LANGUAGE RoleAnnotations     #-}
 
-{-# LANGUAGE DeriveDataTypeable#-}
+{-# OPTIONS_GHC -Wno-unused-binds #-}
+{-# OPTIONS_GHC -Wno-redundant-constraints #-}
 
 -- | Checked exceptions
 module Hackage.Security.Util.Checked (
@@ -25,16 +20,12 @@
   , internalError
   ) where
 
-import MyPrelude
+import Prelude
 import Control.Exception (Exception, IOException)
 import qualified Control.Exception as Base
 import Data.Typeable (Typeable)
 
-#if __GLASGOW_HASKELL__ >= 708
 import GHC.Prim (coerce)
-#else
-import Unsafe.Coerce (unsafeCoerce)
-#endif
 
 {-------------------------------------------------------------------------------
   Basic infrastructure
@@ -43,9 +34,7 @@
 -- | Checked exceptions
 class Throws e where
 
-#if __GLASGOW_HASKELL__ >= 708
 type role Throws representational
-#endif
 
 unthrow :: forall a e proxy . proxy e -> (Throws e => a) -> a
 unthrow _ x = unWrap (coerceWrap (Wrap x :: Wrap e a))
@@ -56,22 +45,10 @@
 
 -- | Determine if an exception is asynchronous, based on its type.
 isAsync :: Exception e => e -> Bool
-#if MIN_VERSION_base(4, 7, 0)
 isAsync e =
   case Base.fromException $ Base.toException e of
     Just Base.SomeAsyncException{} -> True
     Nothing -> False
-#else
--- Earlier versions of GHC had no SomeAsyncException. We have to
--- instead make up a list of async exceptions.
-isAsync e =
-  let se = Base.toException e
-   in case () of
-        ()
-          | Just (_ :: Base.AsyncException) <- Base.fromException se -> True
-          | show e == "<<timeout>>" -> True
-          | otherwise -> False
-#endif
 
 -- | 'Base.catch', but immediately rethrows asynchronous exceptions
 -- (as determined by 'isAsync').
@@ -131,11 +108,7 @@
 newtype Wrap e a = Wrap { unWrap :: Throws e => a }
 
 coerceWrap :: Wrap e a -> Wrap (Catch e) a
-#if __GLASGOW_HASKELL__ >= 708
 coerceWrap = coerce
-#else
-coerceWrap = unsafeCoerce
-#endif
 
 data Proxy a = Proxy
 
diff --git a/hackage-security/hackage-security/src/Hackage/Security/Util/Exit.hs b/hackage-security/hackage-security/src/Hackage/Security/Util/Exit.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/Util/Exit.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/Util/Exit.hs
@@ -1,6 +1,6 @@
 module Hackage.Security.Util.Exit where
 
-import MyPrelude
+import Prelude
 import Control.Monad (liftM)
 import Control.Monad.Except (ExceptT, runExceptT, throwError)
 
diff --git a/hackage-security/hackage-security/src/Hackage/Security/Util/IO.hs b/hackage-security/hackage-security/src/Hackage/Security/Util/IO.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/Util/IO.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/Util/IO.hs
@@ -9,7 +9,7 @@
   , timedIO
   ) where
 
-import MyPrelude
+import Prelude
 import Control.Concurrent (threadDelay)
 import Control.Exception
 import Data.Time
diff --git a/hackage-security/hackage-security/src/Hackage/Security/Util/JSON.hs b/hackage-security/hackage-security/src/Hackage/Security/Util/JSON.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/Util/JSON.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/Util/JSON.hs
@@ -1,7 +1,5 @@
 {-# LANGUAGE CPP #-}
-#if __GLASGOW_HASKELL__ < 710
-{-# LANGUAGE OverlappingInstances #-}
-#endif
+
 -- |
 module Hackage.Security.Util.JSON (
     -- * Type classes
@@ -23,7 +21,7 @@
   , Int54
   ) where
 
-import MyPrelude
+import Prelude
 import Control.Monad (liftM)
 import Data.Maybe (catMaybes)
 import Data.Map (Map)
@@ -32,10 +30,6 @@
 import Network.URI
 import qualified Data.Map as Map
 
-#if !MIN_VERSION_time(1,5,0)
-import System.Locale (defaultTimeLocale)
-#endif
-
 import Hackage.Security.Util.Path
 
 {-------------------------------------------------------------------------------
@@ -120,16 +114,12 @@
   fromJSON val       = expected' "int" val
 
 instance
-#if __GLASGOW_HASKELL__ >= 710
   {-# OVERLAPPABLE #-}
-#endif
     (Monad m, ToJSON m a) => ToJSON m [a] where
   toJSON = liftM JSArray . mapM toJSON
 
 instance
-#if __GLASGOW_HASKELL__ >= 710
   {-# OVERLAPPABLE #-}
-#endif
     (ReportSchemaErrors m, FromJSON m a) => FromJSON m [a] where
   fromJSON (JSArray as) = mapM fromJSON as
   fromJSON val          = expected' "array" val
@@ -143,10 +133,6 @@
     case parseTimeM False defaultTimeLocale "%FT%TZ" str of
       Just time -> return time
       Nothing   -> expected "valid date-time string" (Just str)
-#if !MIN_VERSION_time(1,5,0)
-    where
-      parseTimeM _trim = parseTime
-#endif
 
 instance ( Monad m
          , ToObjectKey m k
diff --git a/hackage-security/hackage-security/src/Hackage/Security/Util/Lens.hs b/hackage-security/hackage-security/src/Hackage/Security/Util/Lens.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/Util/Lens.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/Util/Lens.hs
@@ -14,7 +14,7 @@
   , set
   ) where
 
-import MyPrelude
+import Prelude
 import Control.Applicative
 import Data.Functor.Identity
 
diff --git a/hackage-security/hackage-security/src/Hackage/Security/Util/Path.hs b/hackage-security/hackage-security/src/Hackage/Security/Util/Path.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/Util/Path.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/Util/Path.hs
@@ -83,16 +83,12 @@
   , IO.hSeek
   ) where
 
-import MyPrelude
+import Prelude
 import Control.Monad
 import Data.List (isPrefixOf)
 import System.IO (IOMode(..), BufferMode(..), Handle, SeekMode(..))
 import System.IO.Unsafe (unsafeInterleaveIO)
-#if MIN_VERSION_directory(1,2,0)
 import Data.Time (UTCTime)
-#else
-import System.Time (ClockTime)
-#endif
 import qualified Data.ByteString         as BS
 import qualified Data.ByteString.Lazy    as BS.L
 import qualified System.FilePath         as FP.Native
@@ -239,21 +235,7 @@
   toAbsoluteFilePath :: Path root -> IO FilePath
 
 instance FsRoot Relative where
-    toAbsoluteFilePath p = go (unPathNative p)
-      where
-        go :: FilePath -> IO FilePath
-#if MIN_VERSION_directory(1,2,2)
-        go = Dir.makeAbsolute
-#else
-        -- copied implementation from the directory package
-        go = (FP.Native.normalise <$>) . absolutize
-        absolutize path -- avoid the call to `getCurrentDirectory` if we can
-          | FP.Native.isRelative path
-                      = (FP.Native.</> path)
-                      . FP.Native.addTrailingPathSeparator <$>
-                        Dir.getCurrentDirectory
-          | otherwise = return path
-#endif
+    toAbsoluteFilePath p = Dir.makeAbsolute (unPathNative p)
 
 instance FsRoot Absolute where
     toAbsoluteFilePath = return . unPathNative
@@ -371,11 +353,7 @@
     filePath <- toAbsoluteFilePath path
     Dir.doesDirectoryExist filePath
 
-#if MIN_VERSION_directory(1,2,0)
 getModificationTime :: FsRoot root => Path root -> IO UTCTime
-#else
-getModificationTime :: FsRoot root => Path root -> IO ClockTime
-#endif
 getModificationTime path = do
     filePath <- toAbsoluteFilePath path
     Dir.getModificationTime filePath
diff --git a/hackage-security/hackage-security/src/Hackage/Security/Util/Pretty.hs b/hackage-security/hackage-security/src/Hackage/Security/Util/Pretty.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/Util/Pretty.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/Util/Pretty.hs
@@ -3,7 +3,7 @@
     Pretty(..)
   ) where
 
-import MyPrelude
+import Prelude
 
 -- | Produce a human-readable string
 class Pretty a where
diff --git a/hackage-security/hackage-security/src/Hackage/Security/Util/Some.hs b/hackage-security/hackage-security/src/Hackage/Security/Util/Some.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/Util/Some.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/Util/Some.hs
@@ -13,30 +13,17 @@
   , SomePretty(..)
     -- ** Type checking
   , typecheckSome
-#if !MIN_VERSION_base(4,7,0)
-    -- ** Compatibility with base < 4.7
-  , tyConSome
-#endif
   ) where
 
-import MyPrelude
-#if MIN_VERSION_base(4,7,0)
+import Prelude
 import Data.Typeable (Typeable)
-#else
-import qualified Data.Typeable as Typeable
-#endif
 
 import Hackage.Security.Util.TypedEmbedded
 import Hackage.Security.Util.Pretty
 
 data Some f = forall a. Some (f a)
 
-#if MIN_VERSION_base(4,7,0)
 deriving instance Typeable Some
-#else
-tyConSome :: Typeable.TyCon
-tyConSome = Typeable.mkTyCon3 "hackage-security" "Hackage.Security.Util.Some" "Some"
-#endif
 
 {-------------------------------------------------------------------------------
   Equality on Some types
diff --git a/hackage-security/hackage-security/src/Hackage/Security/Util/Stack.hs b/hackage-security/hackage-security/src/Hackage/Security/Util/Stack.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/Util/Stack.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/Util/Stack.hs
@@ -3,7 +3,7 @@
     (:-)(..)
   ) where
 
-import MyPrelude
+import Prelude
 
 data h :- t = h :- t
   deriving (Eq, Show)
diff --git a/hackage-security/hackage-security/src/Hackage/Security/Util/TypedEmbedded.hs b/hackage-security/hackage-security/src/Hackage/Security/Util/TypedEmbedded.hs
--- a/hackage-security/hackage-security/src/Hackage/Security/Util/TypedEmbedded.hs
+++ b/hackage-security/hackage-security/src/Hackage/Security/Util/TypedEmbedded.hs
@@ -7,7 +7,7 @@
   , AsType(..)
   ) where
 
-import MyPrelude
+import Prelude
 
 -- | Type equality proofs
 --
diff --git a/hackage-security/hackage-security/src/MyPrelude.hs b/hackage-security/hackage-security/src/MyPrelude.hs
deleted file mode 100644
--- a/hackage-security/hackage-security/src/MyPrelude.hs
+++ /dev/null
@@ -1,31 +0,0 @@
--- | 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/hackage-security/hackage-security/src/Text/JSON/Canonical.hs b/hackage-security/hackage-security/src/Text/JSON/Canonical.hs
--- a/hackage-security/hackage-security/src/Text/JSON/Canonical.hs
+++ b/hackage-security/hackage-security/src/Text/JSON/Canonical.hs
@@ -30,21 +30,16 @@
   , prettyCanonicalJSON
   ) where
 
-import MyPrelude
+import Prelude
 import Text.ParserCombinators.Parsec
          ( CharParser, (<|>), (<?>), many, between, sepBy
          , satisfy, char, string, digit, spaces
          , parse )
 import Text.PrettyPrint hiding (char)
 import qualified Text.PrettyPrint as Doc
-#if !(MIN_VERSION_base(4,7,0))
-import Control.Applicative ((<$>), (<$), pure, (<*>), (<*), (*>))
-#endif
 import Control.Arrow (first)
 import Data.Bits (Bits)
-#if MIN_VERSION_base(4,7,0)
 import Data.Bits (FiniteBits)
-#endif
 import Data.Char (isDigit, digitToInt)
 import Data.Data (Data)
 import Data.Function (on)
@@ -83,9 +78,7 @@
            , Ord
            , Real
            , Ix
-#if MIN_VERSION_base(4,7,0)
            , FiniteBits
-#endif
            , Bits
            , Storable
            , PrintfArg
@@ -353,4 +346,3 @@
     go []     = []
     go [y]    = [p <+> y, r]
     go (y:ys) = (p <+> y) : go ys
-
diff --git a/hackage-security/precompute-fileinfo/precompute-fileinfo.cabal b/hackage-security/precompute-fileinfo/precompute-fileinfo.cabal
--- a/hackage-security/precompute-fileinfo/precompute-fileinfo.cabal
+++ b/hackage-security/precompute-fileinfo/precompute-fileinfo.cabal
@@ -15,13 +15,12 @@
 cabal-version:       >=1.10
 
 tested-with:
-  GHC==9.4.1, GHC==9.2.4, GHC==9.0.2,
-  GHC==8.10.7, GHC==8.8.4, GHC==8.6.5, GHC==8.4.4, GHC==8.2.2, GHC==8.0.2,
-  GHC==7.10.3, GHC==7.8.4, GHC==7.6.3, GHC==7.4.2
+  GHC==9.6.3,  GHC==9.4.5, GHC==9.2.8, GHC==9.0.2,
+  GHC==8.10.7, GHC==8.8.4, GHC==8.6.5, GHC==8.4.4, GHC==8.2.2, GHC==8.0.2
 
 executable precompute-fileinfo
   main-is:             Main.hs
-  build-depends:       base                 >= 4.4,
+  build-depends:       base                 >= 4.9,
                        bytestring           >= 0.9,
                        containers           >= 0.4,
                        deepseq              >= 1.3,
diff --git a/hackport.cabal b/hackport.cabal
--- a/hackport.cabal
+++ b/hackport.cabal
@@ -1,6 +1,6 @@
 cabal-version: 3.0
 name:          hackport
-version:       0.8.4.0
+version:       0.8.5.0
 license:       GPL-3.0-or-later
 license-file:  LICENSE
 author:        Henning Günther, Duncan Coutts, Lennart Kolmodin
@@ -14,11 +14,10 @@
   that are generated from a hackage repo of Cabal packages.
 
 tested-with:
-  , GHC == 8.8.4
-  , GHC == 8.10.7
   , GHC == 9.0.2
-  , GHC == 9.2.7
-  , GHC == 9.4.5
+  , GHC == 9.2.8
+  , GHC == 9.4.8
+  , GHC == 9.6.4
 
 source-repository head
   type:     git
@@ -29,6 +28,11 @@
   manual:      True
   default:     False
 
+flag doctests
+  description: Build doctests
+  default:     True
+  manual:      True
+
 flag gentoo-tests
   description: Build tests that require a running Gentoo system
   manual:      True
@@ -44,6 +48,11 @@
   default:     False
   manual:      True
 
+flag threads
+  description: Enable threading and rtsopts
+  default:     True
+  manual:      True
+
 -- Turn off all warnings (for external libs and doctests-v2)
 common no-warnings
   ghc-options: -Wno-default -Wno-incomplete-uni-patterns
@@ -71,7 +80,6 @@
   hs-source-dirs:   cabal/Cabal-syntax/src
   build-depends:
     , array         >=0.4.0.1
-    , array         >=0.4.0.1
     , base          >=4.6      && <5
     , binary        >=0.7
     , bytestring    >=0.10.0.0
@@ -427,13 +435,13 @@
   hs-source-dirs:     hackage-security/hackage-security/src
   build-depends:
     , hackport-external-libs-Cabal-syntax
-    , base                          >=4.5
+    , base                          >=4.9
     , base16-bytestring             >=0.1.1
     , base64-bytestring             >=1.0
     , bytestring                    >=0.9
     , containers                    >=0.4
     , cryptohash-sha256             >=0.11
-    , directory                     >=1.2
+    , directory                     >=1.2.2
     , ed25519                       >=0.0
     , filepath                      >=1.2
     , ghc-prim
@@ -445,7 +453,7 @@
     , pretty                        >=1.0
     , tar                           >=0.5
     , template-haskell              >=2.7
-    , time                          >=1.2
+    , time                          >=1.5
     , transformers                  >=0.3
     , zlib                          >=0.5
 
@@ -454,15 +462,15 @@
     Hackage.Security.Client.Formats
     Hackage.Security.Client.Repository
     Hackage.Security.Client.Repository.Cache
-    Hackage.Security.Client.Repository.HttpLib
     Hackage.Security.Client.Repository.Local
     Hackage.Security.Client.Repository.Remote
+    Hackage.Security.Client.Repository.HttpLib
     Hackage.Security.Client.Verify
     Hackage.Security.JSON
     Hackage.Security.Key.Env
 --     Hackage.Security.Server
-    Hackage.Security.TUF.FileMap
     Hackage.Security.Trusted
+    Hackage.Security.TUF.FileMap
     Hackage.Security.Util.Checked
     Hackage.Security.Util.Path
     Hackage.Security.Util.Pretty
@@ -494,7 +502,6 @@
     Hackage.Security.Util.Lens
     Hackage.Security.Util.Stack
     Hackage.Security.Util.TypedEmbedded
-    MyPrelude
 
   default-extensions:
     DefaultSignatures
@@ -509,6 +516,7 @@
     NamedFieldPuns
     NoImplicitPrelude
     NoMonomorphismRestriction
+    PatternSynonyms
     RankNTypes
     RecordWildCards
     ScopedTypeVariables
@@ -519,10 +527,14 @@
     ViewPatterns
 
   other-extensions:
+    AllowAmbiguousTypes
     BangPatterns
     CPP
+    DeriveLift
     OverlappingInstances
     PackageImports
+    RoleAnnotations
+    StaticPointers
     UndecidableInstances
 
 library hackport-external-libs-cabal-install-solver
@@ -670,6 +682,7 @@
     Distribution.Client.Compat.Prelude
 --     Distribution.Client.Compat.Process
     Distribution.Client.Compat.Semaphore
+    Distribution.Client.Compat.Tar
     Distribution.Client.Config
 --     Distribution.Client.Configure
     Distribution.Client.Dependency
@@ -786,12 +799,12 @@
     , binary
     , bytestring
     , containers
+    , data-default-class
     , deepseq
     , directory
     , dlist
     , extensible-exceptions
     , filepath
-    , ghc-compact
     , lifted-base
     , monad-control
     , mtl
@@ -856,7 +869,6 @@
     Portage.Overlay
     Portage.PackageId
     Portage.Resolve
-    Portage.Tables
     Portage.Use
     Portage.Version
     Status
@@ -867,9 +879,10 @@
 
 executable hackport
   import:           warnings
-  ghc-options:      -threaded +RTS -N -RTS -with-rtsopts=-N
+  if flag(threads)
+    ghc-options:      -threaded -rtsopts -with-rtsopts=-N
   if flag(profile)
-    ghc-prof-options: -fprof-cafs -fprof-auto -rtsopts
+    ghc-prof-options: -prof-cafs -prof-auto -rtsopts
   main-is:          Main.hs
   default-language: Haskell2010
   hs-source-dirs:   exe
@@ -1021,7 +1034,7 @@
 
   other-modules:        Paths_hackport
 
-  if !flag(cabal-v1)
+  if !flag(doctests) || !flag(cabal-v1)
     buildable: False
 
 test-suite doctests-v2
@@ -1038,7 +1051,7 @@
     -- cabal-install should already be installed if this is being built...
     , doctest:doctest      >=0.8
 
-  if flag(cabal-v1)
+  if !flag(doctests) || flag(cabal-v1)
     buildable: False
 
 test-suite spec
diff --git a/src/Data/Trie.hs b/src/Data/Trie.hs
--- a/src/Data/Trie.hs
+++ b/src/Data/Trie.hs
@@ -7,19 +7,16 @@
     , singleton
     , lookup
     , toList
-    , buildCompact
     ) where
 
 import Control.Applicative
 import Control.Monad
-import Control.Monad.IO.Class
 import Data.Binary
 import qualified Data.DList as DList
 import Data.DList (DList)
 import qualified Data.Foldable as F
 import qualified Data.Map.Strict as Map
 import Data.Map.Strict (Map)
-import GHC.Compact
 import GHC.Generics
 
 import Prelude hiding (lookup)
@@ -67,17 +64,3 @@
   where
     go (k:ks) = Nothing :< Map.singleton k (go ks)
     go []     = Just x :< Map.empty
-
--- | Build a 'Trie' within a compact region
-buildCompact :: (MonadIO m, Ord k)
-    => (a -> ([k], b))
-    -> [a]
-    -> m (Compact (Trie k b))
-buildCompact _ [] = liftIO $ compact mempty
-buildCompact f (x:xs) = do
-    ct <- buildCompact f xs
-    cs <- liftIO $ compactAdd ct (f x)
-    let (t,(s,b)) = (getCompact ct, getCompact cs)
-    cq <- liftIO $ compactAdd ct $ t <> singleton s b
-    pure cq
-
diff --git a/src/Hackport/Command/MakeEbuild.hs b/src/Hackport/Command/MakeEbuild.hs
--- a/src/Hackport/Command/MakeEbuild.hs
+++ b/src/Hackport/Command/MakeEbuild.hs
@@ -1,7 +1,12 @@
+{-# LANGUAGE CPP #-}
+
 module Hackport.Command.MakeEbuild
   ( makeEbuildAction
   ) where
 
+#if MIN_VERSION_mtl(2,3,0)
+import Control.Monad
+#endif
 import qualified Distribution.Simple.PackageDescription as Cabal
 import Distribution.Parsec (simpleParsec)
 import qualified Distribution.Verbosity as V
diff --git a/src/Hackport/Completion.hs b/src/Hackport/Completion.hs
--- a/src/Hackport/Completion.hs
+++ b/src/Hackport/Completion.hs
@@ -13,7 +13,6 @@
 import Data.Maybe (catMaybes)
 import qualified Data.Set as Set
 import Data.Set (Set)
-import GHC.Compact
 import qualified Options.Applicative as Opt
 import System.Exit (ExitCode(..))
 import System.FilePath
@@ -89,33 +88,33 @@
 --   This is used exclusively for shell completion for the @merge@
 --   subcommand.
 cabalPackageCompleter :: Opt.Completer
-cabalPackageCompleter = Opt.mkCompleter $ \s ->
-    runEnv (go s) () $ GlobalEnv V.silent Nothing Nothing
-  where
-    go s = withHackportContext $ \_ repoContext -> do
-        Just trie <- runMaybeT $ choice
-            [ -- Check to see if there is an existing cache.
-              readTrie
-              -- Otherwise, create a new trie from the Hackage database
-            , lift $ createTrie repoContext
-            ]
+cabalPackageCompleter = Opt.mkCompleter $ \s -> do
+    Just trie <- runMaybeT $ choice
+        [ -- Check to see if there is an existing cache.
+          readTrie
+          -- Otherwise, create a new trie from the Hackage database
+        , lift $ runEnv createTrie () $ GlobalEnv V.silent Nothing Nothing
+        ]
 
-        let endings = map fst $ maybe [] Trie.toList
-                $ Trie.lookup (getCompact trie) s
+    let endings = map fst $ maybe [] Trie.toList
+            $ Trie.lookup trie s
 
-        pure $ map (s ++) endings
+    pure $ map (s ++) endings
 
+  where
+
     -- A (Trie Char ()) is useful for storing/searching a list of strings
-    createTrie repoContext = do
+    createTrie :: Env () (Trie Char ())
+    createTrie = withHackportContext $ \_ repoContext -> do
         pkgs <- allPV repoContext
-        trie <- Trie.buildCompact (,()) pkgs
-        writeTrie (getCompact trie)
+        let trie = foldMap (\s -> Trie.singleton s ()) pkgs
+        writeTrie trie
         pure trie
 
     readTrie :: MonadIO m
-        => MaybeT m (Compact (Trie Char ()))
+        => MaybeT m (Trie Char ())
     readTrie = MaybeT $ liftIO $ optional
-        $ trieFile >>= decodeFile >>= compact
+        $ trieFile >>= decodeFile
 
     writeTrie :: MonadIO m => Trie Char () -> m ()
     writeTrie t = do
diff --git a/src/Hackport/Util.hs b/src/Hackport/Util.hs
--- a/src/Hackport/Util.hs
+++ b/src/Hackport/Util.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE CPP #-}
+
 module Hackport.Util
   ( getPortageDir
   , withHackportContext
@@ -5,6 +7,9 @@
   , hackportDir
   ) where
 
+#if MIN_VERSION_mtl(2,3,0)
+import Control.Monad
+#endif
 import Control.Monad.Trans.Control
 import Data.Maybe (fromJust)
 import qualified Network.URI as NU
diff --git a/src/Merge.hs b/src/Merge.hs
--- a/src/Merge.hs
+++ b/src/Merge.hs
@@ -16,6 +16,7 @@
 
 import           Control.Applicative
 import           Control.Monad
+import           Control.Monad.Writer
 import           Control.Exception.Lifted
 import qualified Data.Text as T
 import qualified Data.Text.IO as T
@@ -392,6 +393,12 @@
   debug $ "buildDepends pkgDesc0: " ++ show (map prettyShow (Merge.exeAndLibDeps pkgDesc0))
   debug $ "buildDepends pkgDesc:  " ++ show (map prettyShow (Merge.buildDepends pkgDesc))
 
+  -- <https://github.com/gentoo-haskell/hackport/issues/116>
+  warnings <- errorWarnOnUnbuildable
+    (prettyShow cat)
+    (prettyShow merged_cabal_pkg_name)
+    pkgDesc0
+
   notice $ "Accepted depends: " ++ show (map prettyShow accepted_deps)
   notice $ "Skipped  depends: " ++ show (map prettyShow skipped_deps)
   notice $ "Dead flags: " ++ show (map pp_fa irresolvable_flag_assignments)
@@ -463,6 +470,8 @@
     fetchDigestAndCheck (overlayPath </> prettyShow cat </> prettyShow norm_pkgName)
       $ Portage.fromCabalPackageId cat cabal_pkgId
 
+  forM_ warnings $ notice . ("\n" ++)
+
 -- | Run @ebuild@ and @pkgcheck@ commands in the directory of the
 -- newly-generated ebuild.
 --
@@ -584,3 +593,51 @@
   when metadataNeedsWriting $ do
     notice $ "Writing " ++ emeta
     liftIO $ T.writeFile mpath updatedMetaText
+
+-- <https://github.com/gentoo-haskell/hackport/issues/116>
+-- TODO: Make it so this is automatically fixed instead of requiring manual
+-- intervention
+errorWarnOnUnbuildable
+    :: String -- Category name
+    -> String -- Package name
+    -> Cabal.PackageDescription
+    -> Env env [String]
+errorWarnOnUnbuildable cn pn pkgdesc = execWriterT $ do
+  let lib = Cabal.library pkgdesc            -- Main library
+      subLibs = Cabal.subLibraries pkgdesc   -- sub-libraries
+      exes = Cabal.executables pkgdesc       -- executables
+      tests = Cabal.testSuites pkgdesc       -- test-suites
+      ubLib = findUnbuildable Cabal.libName Cabal.libBuildInfo lib
+      ubSubLibs = findUnbuildable Cabal.libName Cabal.libBuildInfo subLibs
+      ubExes = findUnbuildable Cabal.exeName Cabal.buildInfo exes
+      ubTests = findUnbuildable Cabal.testName Cabal.testBuildInfo tests
+      ubErrs = execWriter $ do
+        forM_ ubLib $ \_ ->
+          tell ["main library"]
+        forM_ ubSubLibs $ \l ->
+          tell ["sub-library: " ++ Cabal.showLibraryName l]
+      ubWarns = execWriter $ do
+        forM_ ubExes $ \e ->
+          tell ["executable: " ++ Cabal.unUnqualComponentName e]
+        forM_ ubTests $ \t ->
+          tell ["test-suite: " ++ Cabal.unUnqualComponentName t]
+
+  unless (null ubWarns) $ tell $ pure $ unlines
+    $  [ "WARNING: The following components are unbuildable!" ]
+    ++ map ("  - " ++) ubWarns
+
+  unless (null ubErrs) $ error $ unlines
+    $  [ "FATAL: The following library components are unbuildable!" ]
+    ++ map ("  - " ++) ubErrs
+    ++ [ ""
+       , "You can edit the .cabal file to make the needed components buildable,"
+       , "then merge the package manually:"
+       , "  $ cabal get " ++ pn
+       , "  $ cd " ++ pn ++ "*/"
+       , "  # fix " ++ pn ++ ".cabal"
+       , "  $ hackport make-ebuild " ++ cn ++ " " ++ pn ++ ".cabal"
+       ]
+
+  where
+    findUnbuildable toName toBuildable
+        = fmap toName . mfilter (not . Cabal.buildable . toBuildable)
diff --git a/src/Merge/Dependencies.hs b/src/Merge/Dependencies.hs
--- a/src/Merge/Dependencies.hs
+++ b/src/Merge/Dependencies.hs
@@ -20,6 +20,7 @@
   ) where
 
 import           Control.DeepSeq (NFData(..))
+import           Data.Default.Class
 import           Data.Maybe ( isJust, isNothing )
 import qualified Data.List as L
 #if !MIN_VERSION_base(4,11,0)
@@ -42,7 +43,6 @@
 import qualified Portage.Overlay as Portage
 import qualified Portage.PackageId as Portage
 import qualified Portage.Use as Portage
-import qualified Portage.Tables as Portage
 import qualified Cabal2Ebuild as C2E
 
 import qualified Portage.GHCCore as GHCCore
@@ -155,8 +155,8 @@
                               ],
                     dep_e = S.singleton "${RDEPEND}",
                     rdep = Portage.DependAllOf
-                               [ Portage.set_build_slot ghc_dep
-                               , Portage.set_build_slot $ add_profile $ raw_haskell_deps
+                               [ ghc_dep
+                               , add_profile $ raw_haskell_deps
                                , extra_libs
                                , Portage.DependAllOf pkg_config_libs
                                ]
@@ -171,8 +171,8 @@
                               ],
                     dep_e = S.singleton "${RDEPEND}",
                     rdep = Portage.DependAllOf
-                               [ Portage.set_build_slot ghc_dep
-                               , Portage.set_build_slot $ raw_haskell_deps
+                               [ ghc_dep
+                               , raw_haskell_deps
                                , extra_libs
                                , Portage.DependAllOf pkg_config_libs
                                ]
@@ -312,7 +312,10 @@
       , ("m", any_c_p "virtual" "libc")
       , ("asound", any_c_p "media-libs" "alsa-lib")
       , ("sqlite3", at_least_c_p_v "dev-db" "sqlite" [3,0])
-      , ("stdc++", any_c_p_s_u "sys-devel" "gcc" Portage.AnySlot [Portage.mkUse (Portage.Use "cxx")])
+      , ("stdc++", Portage.DependAnyOf
+            [ any_c_p_s_u "sys-devel" "gcc" Portage.AnySlot [Portage.mkUse (Portage.Use "cxx")]
+            , any_c_p "sys-devel" "clang"
+            ])
       , ("crack", any_c_p "sys-libs" "cracklib")
       , ("exif", any_c_p "media-libs" "libexif")
       , ("IL", any_c_p "media-libs" "devil")
@@ -387,6 +390,9 @@
       , ("SDL2_mixer", any_c_p "media-libs" "sdl2-mixer")
       , ("blas", any_c_p "virtual" "blas")
       , ("lapack", any_c_p "virtual" "lapack")
+      , ("libbrotlidec", any_c_p "app-arch" "brotli")
+      , ("libbrotlienc", any_c_p "app-arch" "brotli")
+      , ("libarchive", at_least_c_p_v "app-arch" "libarchive" [3,5,2])
       ]
 
 ---------------------------------------------------------------
@@ -468,121 +474,128 @@
 
 resolvePkgConfig :: Portage.Overlay -> Cabal.PkgconfigDependency -> Maybe Portage.Dependency
 resolvePkgConfig _overlay (Cabal.PkgconfigDependency cabal_pn _cabalVersion) = do
-  (cat,portname, slot) <- lookup (Cabal.unPkgconfigName cabal_pn) pkgconfig_table
-  return $ any_c_p_s_u cat portname slot []
+  (cat, portname, Portage.DAttr slot usedep) <- lookup (Cabal.unPkgconfigName cabal_pn) pkgconfig_table
+  return $ any_c_p_s_u cat portname slot usedep
 
-pkgconfig_table :: [(String, (String, String, Portage.SlotDepend))]
+pkgconfig_table :: [(String, (String, String, Portage.DAttr))]
 pkgconfig_table =
   [
-   ("alsa",         ("media-libs", "alsa-lib", Portage.AnySlot))
-  ,("atk",          ("dev-libs", "atk", Portage.AnySlot))
-  ,("gconf-2.0",    ("gnome-base", "gconf", Portage.AnySlot))
+   ("alsa",         ("media-libs", "alsa-lib", def))
+  ,("atk",          ("app-accessibility", "at-spi2-core", Portage.DAttr (Portage.AnySlot) [Portage.mkUse $ Portage.Use "introspection"]))
+  ,("gconf-2.0",    ("gnome-base", "gconf", def))
 
-  ,("gio-2.0",                ("dev-libs", "glib", Portage.GivenSlot "2"))
-  ,("gio-unix-2.0",           ("dev-libs", "glib", Portage.GivenSlot "2"))
-  ,("glib-2.0",               ("dev-libs", "glib", Portage.GivenSlot "2"))
-  ,("gmodule-2.0",            ("dev-libs", "glib", Portage.GivenSlot "2"))
-  ,("gmodule-export-2.0",     ("dev-libs", "glib", Portage.GivenSlot "2"))
-  ,("gmodule-no-export-2.0",  ("dev-libs", "glib", Portage.GivenSlot "2"))
-  ,("gobject-2.0",            ("dev-libs", "glib", Portage.GivenSlot "2"))
+  ,("gio-2.0",                ("dev-libs", "glib", Portage.DAttr (Portage.GivenSlot "2") []))
+  ,("gio-unix-2.0",           ("dev-libs", "glib", Portage.DAttr (Portage.GivenSlot "2") []))
+  ,("glib-2.0",               ("dev-libs", "glib", Portage.DAttr (Portage.GivenSlot "2") []))
+  ,("gmodule-2.0",            ("dev-libs", "glib", Portage.DAttr (Portage.GivenSlot "2") []))
+  ,("gmodule-export-2.0",     ("dev-libs", "glib", Portage.DAttr (Portage.GivenSlot "2") []))
+  ,("gmodule-no-export-2.0",  ("dev-libs", "glib", Portage.DAttr (Portage.GivenSlot "2") []))
+  ,("gobject-2.0",            ("dev-libs", "glib", Portage.DAttr (Portage.GivenSlot "2") []))
   ,("gobject-introspection-1.0", ("dev-libs", "gobject-introspection",
-                                  Portage.AnySlot))
-  ,("gthread-2.0",            ("dev-libs", "glib", Portage.GivenSlot "2"))
+                                  def))
+  ,("gthread-2.0",            ("dev-libs", "glib", Portage.DAttr (Portage.GivenSlot "2") []))
 
-  ,("gtk+-2.0",            ("x11-libs", "gtk+", Portage.GivenSlot "2"))
-  ,("gdk-2.0",             ("x11-libs", "gtk+", Portage.GivenSlot "2"))
-  ,("gdk-3.0",             ("x11-libs", "gtk+", Portage.GivenSlot "3"))
-  ,("gdk-pixbuf-2.0",      ("x11-libs", "gtk+", Portage.GivenSlot "2"))
-  ,("gdk-pixbuf-xlib-2.0", ("x11-libs", "gtk+", Portage.GivenSlot "2"))
-  ,("gdk-x11-2.0",         ("x11-libs", "gtk+", Portage.GivenSlot "2"))
-  ,("gtk+-unix-print-2.0", ("x11-libs", "gtk+", Portage.GivenSlot "2"))
-  ,("gtk+-x11-2.0",        ("x11-libs", "gtk+", Portage.GivenSlot "2"))
+  ,("gtk+-2.0",            ("x11-libs", "gtk+", Portage.DAttr (Portage.GivenSlot "2") []))
+  ,("gdk-2.0",             ("x11-libs", "gtk+", Portage.DAttr (Portage.GivenSlot "2") []))
+  ,("gdk-3.0",             ("x11-libs", "gtk+", Portage.DAttr (Portage.GivenSlot "3") []))
+  ,("gdk-pixbuf-2.0",      ("x11-libs", "gtk+", Portage.DAttr (Portage.GivenSlot "2") []))
+  ,("gdk-pixbuf-xlib-2.0", ("x11-libs", "gtk+", Portage.DAttr (Portage.GivenSlot "2") []))
+  ,("gdk-x11-2.0",         ("x11-libs", "gtk+", Portage.DAttr (Portage.GivenSlot "2") []))
+  ,("gtk+-unix-print-2.0", ("x11-libs", "gtk+", Portage.DAttr (Portage.GivenSlot "2") []))
+  ,("gtk+-x11-2.0",        ("x11-libs", "gtk+", Portage.DAttr (Portage.GivenSlot "2") []))
 
-  ,("gtk+-3.0",            ("x11-libs", "gtk+", Portage.GivenSlot "3"))
-  ,("webkitgtk-3.0",       ("net-libs", "webkit-gtk", Portage.GivenSlot "3"))
+  ,("gtk+-3.0",            ("x11-libs", "gtk+", Portage.DAttr (Portage.GivenSlot "3") []))
+  ,("webkitgtk-3.0",       ("net-libs", "webkit-gtk", Portage.DAttr (Portage.GivenSlot "3") []))
 
-  ,("cairo",            ("x11-libs", "cairo", Portage.AnySlot)) -- need [svg] for dev-haskell/cairo
-  ,("cairo-gobject",    ("x11-libs", "cairo", Portage.AnySlot)) -- need [glib] for dev-haskell/cairo
-  ,("cairo-ft",         ("x11-libs", "cairo", Portage.AnySlot))
-  ,("cairo-ps",         ("x11-libs", "cairo", Portage.AnySlot))
-  ,("cairo-png",        ("x11-libs", "cairo", Portage.AnySlot))
-  ,("cairo-pdf",        ("x11-libs", "cairo", Portage.AnySlot))
-  ,("cairo-svg",        ("x11-libs", "cairo", Portage.AnySlot))
-  ,("cairo-xlib",         ("x11-libs", "cairo", Portage.AnySlot))
-  ,("cairo-xlib-xrender", ("x11-libs", "cairo", Portage.AnySlot))
+  ,("gtk4",                ("gui-libs", "gtk", Portage.DAttr (Portage.GivenSlot "4") [Portage.mkUse $ Portage.Use "introspection"]))
+  ,("gtk4-x11",            ("gui-libs", "gtk", Portage.DAttr (Portage.GivenSlot "4") [Portage.mkUse $ Portage.Use "introspection", Portage.mkUse $ Portage.Use "X"]))
 
-  ,("javascriptcoregtk-4.0",   ("net-libs", "webkit-gtk", Portage.GivenSlot "4"))
-  ,("webkit2gtk-4.0",          ("net-libs", "webkit-gtk", Portage.GivenSlot "4"))
+  ,("cairo",            ("x11-libs", "cairo", def))
+  ,("cairo-gobject",    ("x11-libs", "cairo", Portage.DAttr (Portage.AnySlot) [Portage.mkUse $ Portage.Use "glib"])) -- need [glib] for dev-haskell/cairo
+  ,("cairo-ft",         ("x11-libs", "cairo", def))
+  ,("cairo-ps",         ("x11-libs", "cairo", def))
+  ,("cairo-png",        ("x11-libs", "cairo", def))
+  ,("cairo-pdf",        ("x11-libs", "cairo", def))
+  ,("cairo-svg",        ("x11-libs", "cairo", def))
+  ,("cairo-xlib",         ("x11-libs", "cairo", def))
+  ,("cairo-xlib-xrender", ("x11-libs", "cairo", def))
 
-  ,("pangocairo",       ("x11-libs", "pango", Portage.AnySlot))
-  ,("pangoft2",         ("x11-libs", "pango", Portage.AnySlot))
-  ,("pango",            ("x11-libs", "pango", Portage.AnySlot))
-  ,("pangoxft",         ("x11-libs", "pango", Portage.AnySlot))
-  ,("pangox",           ("x11-libs", "pango", Portage.AnySlot))
+  ,("javascriptcoregtk-4.0",   ("net-libs", "webkit-gtk", Portage.DAttr (Portage.GivenSlot "4") []))
+  ,("webkit2gtk-4.0",          ("net-libs", "webkit-gtk", Portage.DAttr (Portage.GivenSlot "4") []))
 
-  ,("libglade-2.0", ("gnome-base", "libglade", Portage.AnySlot))
-  ,("libsoup-2.4",   ("net-libs", "libsoup", Portage.GivenSlot "2.4"))
-  ,("gnome-vfs-2.0", ("gnome-base", "gnome-vfs", Portage.AnySlot))
-  ,("gnome-vfs-module-2.0", ("gnome-base", "gnome-vfs", Portage.AnySlot))
-  ,("webkit-1.0", ("net-libs","webkit-gtk", Portage.GivenSlot "2"))
-  ,("gtksourceview-3.0", ("x11-libs", "gtksourceview", Portage.GivenSlot "3.0"))
+  ,("pangocairo",       ("x11-libs", "pango", def))
+  ,("pangoft2",         ("x11-libs", "pango", def))
+  ,("pango",            ("x11-libs", "pango", Portage.DAttr (Portage.AnySlot) [Portage.mkUse $ Portage.Use "introspection"]))
+  ,("pangoxft",         ("x11-libs", "pango", def))
+  ,("pangox",           ("x11-libs", "pango", def))
 
-  ,("gstreamer-0.10",              ("media-libs", "gstreamer", Portage.AnySlot))
-  ,("gstreamer-base-0.10",         ("media-libs", "gstreamer", Portage.AnySlot))
-  ,("gstreamer-check-0.10",        ("media-libs", "gstreamer", Portage.AnySlot))
-  ,("gstreamer-controller-0.10",   ("media-libs", "gstreamer", Portage.AnySlot))
-  ,("gstreamer-dataprotocol-0.10", ("media-libs", "gstreamer", Portage.AnySlot))
-  ,("gstreamer-net-0.10",          ("media-libs", "gstreamer", Portage.AnySlot))
+  ,("libglade-2.0", ("gnome-base", "libglade", def))
+  ,("libsoup-2.4",   ("net-libs", "libsoup", Portage.DAttr (Portage.GivenSlot "2.4") []))
+  ,("gnome-vfs-2.0", ("gnome-base", "gnome-vfs", def))
+  ,("gnome-vfs-module-2.0", ("gnome-base", "gnome-vfs", def))
+  ,("webkit-1.0", ("net-libs","webkit-gtk", Portage.DAttr (Portage.GivenSlot "2") []))
+  ,("gtksourceview-3.0", ("x11-libs", "gtksourceview", Portage.DAttr (Portage.GivenSlot "3.0") []))
 
-  ,("gstreamer-app-0.10",          ("media-libs", "gst-plugins-base", Portage.AnySlot))
-  ,("gstreamer-audio-0.10",        ("media-libs", "gst-plugins-base", Portage.AnySlot))
-  ,("gstreamer-video-0.10",        ("media-libs", "gst-plugins-base", Portage.AnySlot))
-  ,("gstreamer-plugins-base-0.10", ("media-libs", "gst-plugins-base", Portage.AnySlot))
+  ,("gstreamer-0.10",              ("media-libs", "gstreamer", def))
+  ,("gstreamer-base-0.10",         ("media-libs", "gstreamer", def))
+  ,("gstreamer-check-0.10",        ("media-libs", "gstreamer", def))
+  ,("gstreamer-controller-0.10",   ("media-libs", "gstreamer", def))
+  ,("gstreamer-dataprotocol-0.10", ("media-libs", "gstreamer", def))
+  ,("gstreamer-net-0.10",          ("media-libs", "gstreamer", def))
 
-  ,("gtksourceview-2.0",           ("x11-libs", "gtksourceview", Portage.GivenSlot "2.0"))
-  ,("librsvg-2.0",                 ("gnome-base","librsvg", Portage.AnySlot))
-  ,("vte",                         ("x11-libs","vte", Portage.GivenSlot "0"))
-  ,("gtkglext-1.0",                ("x11-libs","gtkglext", Portage.AnySlot))
+  ,("gstreamer-app-0.10",          ("media-libs", "gst-plugins-base", def))
+  ,("gstreamer-audio-0.10",        ("media-libs", "gst-plugins-base", def))
+  ,("gstreamer-video-0.10",        ("media-libs", "gst-plugins-base", def))
+  ,("gstreamer-plugins-base-0.10", ("media-libs", "gst-plugins-base", def))
 
-  ,("curl",                        ("net-misc", "curl", Portage.AnySlot))
-  ,("libxml2",                     ("dev-libs", "libxml2", Portage.AnySlot))
-  ,("libgsasl",                    ("virtual", "gsasl", Portage.AnySlot))
-  ,("libzip",                      ("dev-libs", "libzip", Portage.AnySlot))
-  ,("gnutls",                      ("net-libs", "gnutls", Portage.AnySlot))
-  ,("libidn",                      ("net-dns", "libidn", Portage.AnySlot))
-  ,("libxml-2.0",                  ("dev-libs", "libxml2", Portage.AnySlot))
-  ,("yaml-0.1",                    ("dev-libs", "libyaml", Portage.AnySlot))
-  ,("QtCore",                      ("dev-qt", "qtcore", Portage.AnySlot))
-  ,("lua",                         ("dev-lang", "lua", Portage.AnySlot))
-  ,("QtDeclarative",               ("dev-qt", "qtdeclarative", Portage.AnySlot))
-  ,("QtGui",                       ("dev-qt", "qtgui", Portage.AnySlot))
-  ,("QtOpenGL",                    ("dev-qt", "qtopengl", Portage.AnySlot))
-  ,("QtScript",                    ("dev-qt", "qtscript", Portage.AnySlot))
-  ,("ImageMagick",                 ("media-gfx", "imagemagick", Portage.AnySlot))
-  ,("MagickWand",                  ("media-gfx", "imagemagick", Portage.AnySlot))
-  ,("ncurses",                     ("sys-libs", "ncurses", Portage.AnySlot))
-  ,("ncursesw",                    ("sys-libs", "ncurses", Portage.AnySlot))
-  ,("panel",                       ("sys-libs", "ncurses", Portage.AnySlot))
-  ,("panelw",                      ("sys-libs", "ncurses", Portage.AnySlot))
-  ,("libssh2",                     ("net-libs", "libssh2", Portage.AnySlot))
-  ,("SDL_image",                   ("media-libs", "sdl-image", Portage.AnySlot))
-  ,("libzmq",                      ("net-libs", "zeromq", Portage.AnySlot))
-  ,("taglib_c",                    ("media-libs", "taglib", Portage.AnySlot))
-  ,("libcurl",                     ("net-misc", "curl", Portage.AnySlot))
-  ,("libpq",                       ("dev-db", "postgresql", Portage.AnySlot))
-  ,("poppler-glib",                ("app-text", "poppler", Portage.AnySlot))
-  ,("gsl",                         ("sci-libs", "gsl", Portage.AnySlot))
-  ,("libvirt",                     ("app-emulation", "libvirt", Portage.AnySlot))
+  ,("gtksourceview-2.0",           ("x11-libs", "gtksourceview", Portage.DAttr (Portage.GivenSlot "2.0") []))
+  ,("librsvg-2.0",                 ("gnome-base","librsvg", def))
+  ,("vte",                         ("x11-libs","vte", Portage.DAttr (Portage.GivenSlot "0") []))
+  ,("gtkglext-1.0",                ("x11-libs","gtkglext", def))
 
-  ,("Qt5Core",                     ("dev-qt", "qtcore", Portage.GivenSlot "5"))
-  ,("Qt5Gui",                      ("dev-qt", "qtgui", Portage.GivenSlot "5"))
-  ,("Qt5Qml",                      ("dev-qt", "qtdeclarative", Portage.GivenSlot "5"))
-  ,("Qt5Quick",                    ("dev-qt", "qtdeclarative", Portage.GivenSlot "5"))
-  ,("Qt5Widgets",                  ("dev-qt", "qtwidgets", Portage.GivenSlot "5"))
+  ,("curl",                        ("net-misc", "curl", def))
+  ,("libxml2",                     ("dev-libs", "libxml2", def))
+  ,("libgsasl",                    ("net-misc", "gsasl", def))
+  ,("libzip",                      ("dev-libs", "libzip", def))
+  ,("gnutls",                      ("net-libs", "gnutls", def))
+  ,("libidn",                      ("net-dns", "libidn", def))
+  ,("libxml-2.0",                  ("dev-libs", "libxml2", def))
+  ,("yaml-0.1",                    ("dev-libs", "libyaml", def))
+  ,("QtCore",                      ("dev-qt", "qtcore", def))
+  ,("lua",                         ("dev-lang", "lua", def))
+  ,("QtDeclarative",               ("dev-qt", "qtdeclarative", def))
+  ,("QtGui",                       ("dev-qt", "qtgui", def))
+  ,("QtOpenGL",                    ("dev-qt", "qtopengl", def))
+  ,("QtScript",                    ("dev-qt", "qtscript", def))
+  ,("ImageMagick",                 ("media-gfx", "imagemagick", def))
+  ,("MagickWand",                  ("media-gfx", "imagemagick", def))
+  ,("ncurses",                     ("sys-libs", "ncurses", def))
+  ,("ncursesw",                    ("sys-libs", "ncurses", def))
+  ,("panel",                       ("sys-libs", "ncurses", def))
+  ,("panelw",                      ("sys-libs", "ncurses", def))
+  ,("libssh2",                     ("net-libs", "libssh2", def))
+  ,("SDL_image",                   ("media-libs", "sdl-image", def))
+  ,("libzmq",                      ("net-libs", "zeromq", def))
+  ,("taglib_c",                    ("media-libs", "taglib", def))
+  ,("libcurl",                     ("net-misc", "curl", def))
+  ,("libpq",                       ("dev-db", "postgresql", def))
+  ,("poppler-glib",                ("app-text", "poppler", def))
+  ,("gsl",                         ("sci-libs", "gsl", def))
+  ,("libvirt",                     ("app-emulation", "libvirt", def))
 
-  ,("sdl2",                        ("media-libs", "libsdl2", Portage.AnySlot))
-  ,("SDL2_image",                  ("media-libs", "sdl2-image", Portage.AnySlot))
-  ,("SDL2_mixer",                  ("media-libs", "sdl2-mixer", Portage.AnySlot))
-  ,("zlib",                        ("sys-libs", "zlib", Portage.AnySlot))
-  ,("libpcre",                     ("dev-libs", "libpcre", Portage.AnySlot))
+  ,("Qt5Core",                     ("dev-qt", "qtcore", Portage.DAttr (Portage.GivenSlot "5") []))
+  ,("Qt5Gui",                      ("dev-qt", "qtgui", Portage.DAttr (Portage.GivenSlot "5") []))
+  ,("Qt5Qml",                      ("dev-qt", "qtdeclarative", Portage.DAttr (Portage.GivenSlot "5") []))
+  ,("Qt5Quick",                    ("dev-qt", "qtdeclarative", Portage.DAttr (Portage.GivenSlot "5") []))
+  ,("Qt5Widgets",                  ("dev-qt", "qtwidgets", Portage.DAttr (Portage.GivenSlot "5") []))
+
+  ,("sdl2",                        ("media-libs", "libsdl2", def))
+  ,("SDL2_image",                  ("media-libs", "sdl2-image", def))
+  ,("SDL2_mixer",                  ("media-libs", "sdl2-mixer", def))
+  ,("zlib",                        ("sys-libs", "zlib", def))
+  ,("libpcre",                     ("dev-libs", "libpcre", def))
+  ,("graphene-gobject-1.0",        ("media-libs", "graphene", Portage.DAttr (Portage.AnySlot) [Portage.mkUse $ Portage.Use "introspection"]))
+  ,("harfbuzz",                    ("media-libs", "harfbuzz", def))
+  ,("harfbuzz-gobject",            ("media-libs", "harfbuzz", Portage.DAttr (Portage.AnySlot) [Portage.mkUse $ Portage.Use "introspection"]))
+  ,("x11",                         ("x11-libs", "libX11", def))
   ]
diff --git a/src/Portage/Dependency/Types.hs b/src/Portage/Dependency/Types.hs
--- a/src/Portage/Dependency/Types.hs
+++ b/src/Portage/Dependency/Types.hs
@@ -24,6 +24,7 @@
 import           Portage.Use
 
 import           Control.DeepSeq (NFData(..))
+import           Data.Default.Class
 
 -- | Type of SLOT dependency of a dependency.
 data SlotDepend = AnySlot          -- ^ nothing special
@@ -111,6 +112,9 @@
 
 instance NFData DAttr where
   rnf (DAttr sd uf) = rnf sd `seq` rnf uf
+
+instance Default DAttr where
+  def = DAttr AnySlot []
 
 data Dependency = DependAtom Atom
                 | DependAnyOf         [Dependency]
diff --git a/src/Portage/GHCCore.hs b/src/Portage/GHCCore.hs
--- a/src/Portage/GHCCore.hs
+++ b/src/Portage/GHCCore.hs
@@ -40,29 +40,32 @@
 -- The first @GHC@ version in this list is a minimum default.
 ghcs :: [(DC.CompilerInfo, InstalledPackageIndex)]
 ghcs =
-    [ ghc881, ghc883, ghc884, ghc8101, ghc8104, ghc8106, ghc902, ghc924
-    , ghc925, ghc926
+    [ ghc902, ghc924, ghc925, ghc926, ghc927, ghc928, ghc945, ghc946, ghc947
+    , ghc948, ghc962, ghc963, ghc964
     ]
 
 -- | Maybe determine the appropriate 'Cabal.Version' of the @Cabal@ package
 -- from a given @GHC@ version.
 --
--- >>> cabalFromGHC [8,8,3]
--- Just (mkVersion [3,0,1,0])
+-- >>> cabalFromGHC [9,2,7]
+-- Just (mkVersion [3,6,3,0])
 -- >>> cabalFromGHC [9,9,9,9]
 -- Nothing
 cabalFromGHC :: [Int] -> Maybe Cabal.Version
 cabalFromGHC ver = lookup ver table
   where
-  table = [ ([8,8,1],  Cabal.mkVersion [3,0,0,0])
-          , ([8,8,3],  Cabal.mkVersion [3,0,1,0])
-          , ([8,8,4],  Cabal.mkVersion [3,0,1,0])
-          , ([8,10,1], Cabal.mkVersion [3,2,0,0])
-          , ([8,10,4], Cabal.mkVersion [3,2,1,0])
-          , ([8,10,6], Cabal.mkVersion [3,2,1,0])
-          , ([9,0,2], Cabal.mkVersion [3,4,1,0])
+  table = [ ([9,0,2], Cabal.mkVersion [3,4,1,0])
           , ([9,2,4], Cabal.mkVersion [3,6,3,0])
           , ([9,2,6], Cabal.mkVersion [3,6,3,0])
+          , ([9,2,7], Cabal.mkVersion [3,6,3,0])
+          , ([9,2,8], Cabal.mkVersion [3,6,3,0])
+          , ([9,4,5], Cabal.mkVersion [3,8,1,0])
+          , ([9,4,6], Cabal.mkVersion [3,8,1,0])
+          , ([9,4,7], Cabal.mkVersion [3,8,1,0])
+          , ([9,4,8], Cabal.mkVersion [3,8,1,0])
+          , ([9,6,2], Cabal.mkVersion [3,10,1,0])
+          , ([9,6,3], Cabal.mkVersion [3,10,1,0])
+          , ([9,6,4], Cabal.mkVersion [3,10,1,0])
           ]
 
 platform :: Platform
@@ -70,9 +73,12 @@
 
 -- | Is the package a core dependency of a specific version of @GHC@?
 --
--- >>> packageIsCore (mkIndex ghc883_pkgs) (Cabal.mkPackageName "binary")
+-- >>> packageIsCore (mkIndex [9,2,7] ghc927_pkgs) (Cabal.mkPackageName "binary")
 -- True
--- >>> all (== True) ((packageIsCore (mkIndex ghc883_pkgs)) <$> (packageNamesFromPackageIndex (mkIndex ghc883_pkgs)))
+-- >>> :{
+--   let idx = mkIndex [9,2,7] ghc927_pkgs
+--   in  all (== True) $ packageIsCore idx <$> packageNamesFromPackageIndex idx
+-- :}
 -- True
 packageIsCore :: InstalledPackageIndex -> Cabal.PackageName -> Bool
 packageIsCore index pn = not . null $ lookupPackageName index pn
@@ -129,13 +135,24 @@
 -- | Create an 'InstalledPackageIndex' from a ['Cabal.PackageIdentifier'].
 -- This is used to generate an index of core @GHC@ packages from the provided
 -- ['Cabal.PackageIdentifier'] functions, e.g. 'ghc883_pkgs'.
-mkIndex :: [Cabal.PackageIdentifier] -> InstalledPackageIndex
-mkIndex pids = fromList
-  [ emptyInstalledPackageInfo
-      { sourcePackageId = pindex
-      , exposed = True
-      }
-  | pindex@(Cabal.PackageIdentifier _name _version) <- pids ]
+--
+-- This takes the version of GHC as the first parameter, and uses it to
+-- automatically add @ghc-boot@, @ghc-boot-th@, @ghc-heap@, and @ghci@ (all of
+-- which share the same version number as GHC).
+mkIndex :: [Int] -> [Cabal.PackageIdentifier] -> InstalledPackageIndex
+mkIndex ghcVer pids = fromList
+      [ emptyInstalledPackageInfo
+          { sourcePackageId = pindex
+          , exposed = True
+          }
+      | pindex@(Cabal.PackageIdentifier _name _version) <- pids' ]
+  where
+    pids' =
+        p "ghc-boot" ghcVer
+      : p "ghc-boot-th" ghcVer
+      : p "ghc-heap" ghcVer
+      : p "ghci" ghcVer
+      : pids
 
 packageNamesFromPackageIndex :: InstalledPackageIndex -> [Cabal.PackageName]
 packageNamesFromPackageIndex pix = nub $ map fst $ allPackagesByName pix
@@ -144,37 +161,55 @@
 ghc nrs = DC.unknownCompilerInfo c_id DC.NoAbiTag
     where c_id = CompilerId GHC (mkVersion nrs)
 
-ghc926 :: (DC.CompilerInfo, InstalledPackageIndex)
-ghc926 = (ghc [9,2,6], mkIndex ghc926_pkgs)
+-- | Convenience function to combine the outputs of 'mkIndex' and 'ghc'
+mkInfoIndex
+  :: [Int]
+  -> [Cabal.PackageIdentifier]
+  -> (DC.CompilerInfo, InstalledPackageIndex)
+mkInfoIndex ghcVer pids = (ghc ghcVer, mkIndex ghcVer pids)
 
-ghc925 :: (DC.CompilerInfo, InstalledPackageIndex)
-ghc925 = (ghc [9,2,5], mkIndex ghc925_pkgs)
+ghc964 :: (DC.CompilerInfo, InstalledPackageIndex)
+ghc964 = mkInfoIndex [9,6,4] ghc964_pkgs
 
-ghc924 :: (DC.CompilerInfo, InstalledPackageIndex)
-ghc924 = (ghc [9,2,4], mkIndex ghc924_pkgs)
+ghc963 :: (DC.CompilerInfo, InstalledPackageIndex)
+ghc963 = mkInfoIndex [9,6,3] ghc963_pkgs
 
-ghc902 :: (DC.CompilerInfo, InstalledPackageIndex)
-ghc902 = (ghc [9,0,2], mkIndex ghc902_pkgs)
+ghc962 :: (DC.CompilerInfo, InstalledPackageIndex)
+ghc962 = mkInfoIndex [9,6,2] ghc962_pkgs
 
-ghc8106 :: (DC.CompilerInfo, InstalledPackageIndex)
-ghc8106 = (ghc [8,10,6], mkIndex ghc8106_pkgs)
+ghc948 :: (DC.CompilerInfo, InstalledPackageIndex)
+ghc948 = mkInfoIndex [9,4,8] ghc948_pkgs
 
-ghc8104 :: (DC.CompilerInfo, InstalledPackageIndex)
-ghc8104 = (ghc [8,10,4], mkIndex ghc8104_pkgs)
+ghc947 :: (DC.CompilerInfo, InstalledPackageIndex)
+ghc947 = mkInfoIndex [9,4,7] ghc947_pkgs
 
-ghc8101 :: (DC.CompilerInfo, InstalledPackageIndex)
-ghc8101 = (ghc [8,10,1], mkIndex ghc8101_pkgs)
+ghc946 :: (DC.CompilerInfo, InstalledPackageIndex)
+ghc946 = mkInfoIndex [9,4,6] ghc946_pkgs
 
-ghc884 :: (DC.CompilerInfo, InstalledPackageIndex)
-ghc884 = (ghc [8,8,4], mkIndex ghc884_pkgs)
+ghc945 :: (DC.CompilerInfo, InstalledPackageIndex)
+ghc945 = mkInfoIndex [9,4,5] ghc945_pkgs
 
-ghc883 :: (DC.CompilerInfo, InstalledPackageIndex)
-ghc883 = (ghc [8,8,3], mkIndex ghc883_pkgs)
+ghc928 :: (DC.CompilerInfo, InstalledPackageIndex)
+ghc928 = mkInfoIndex [9,2,8] ghc927_pkgs -- not a mistake: identical to 9.2.7
 
-ghc881 :: (DC.CompilerInfo, InstalledPackageIndex)
-ghc881 = (ghc [8,8,1], mkIndex ghc881_pkgs)
+ghc927 :: (DC.CompilerInfo, InstalledPackageIndex)
+ghc927 = mkInfoIndex [9,2,7] ghc927_pkgs
 
--- | Non-upgradeable core packages
+ghc926 :: (DC.CompilerInfo, InstalledPackageIndex)
+ghc926 = mkInfoIndex [9,2,6] ghc926_pkgs
+
+ghc925 :: (DC.CompilerInfo, InstalledPackageIndex)
+ghc925 = mkInfoIndex [9,2,5] ghc925_pkgs
+
+ghc924 :: (DC.CompilerInfo, InstalledPackageIndex)
+ghc924 = mkInfoIndex [9,2,4] ghc924_pkgs
+
+ghc902 :: (DC.CompilerInfo, InstalledPackageIndex)
+ghc902 = mkInfoIndex [9,0,2] ghc902_pkgs
+
+-- | Non-upgradeable core packages. Some packages are not included for
+-- simplicity (see 'mkIndex').
+--
 -- Sources:
 --  * release notes
 --      example: https://downloads.haskell.org/~ghc/8.6.5/docs/html/users_guide/8.6.5-notes.html
@@ -184,6 +219,244 @@
 --  * https://gitlab.haskell.org/ghc/ghc/-/blob/ghc-9.0.2-release/compiler/ghc.cabal.in#L60-77
 --  * https://flora.pm/packages/%40hackage/ghc/9.0.2/dependencies
 --  * https://gitlab.haskell.org/ghc/ghc/-/wikis/commentary/libraries/version-history
+--  * @./scripts/scan-ghc-library-versions.bash@ in the gentoo-haskell tree
+ghc964_pkgs :: [Cabal.PackageIdentifier]
+ghc964_pkgs =
+  [ p "array" [0,5,5,0]
+  , p "base" [4,18,2,0]
+  , p "binary" [0,8,9,1]
+  , p "bytestring" [0,11,5,3]
+  , p "containers" [0,6,7]
+  , p "deepseq" [1,4,8,1]
+  , p "directory" [1,3,8,1]
+  , p "exceptions" [0,10,7]
+  , p "filepath" [1,4,200,4]
+  , p "ghc-bignum" [1,3]
+  , p "ghc-compact" [0,1,0,0]
+  , p "ghc-prim" [0,10,0]
+  , p "hpc" [0,6,2,0]
+  , p "integer-gmp" [1,1]
+  , p "mtl" [2,3,1]
+  , p "pretty" [1,1,3,6]
+  , p "process" [1,6,17,0]
+  , p "stm" [2,5,1,0]
+  , p "template-haskell" [2,20,0,0]
+  , p "terminfo" [0,4,1,6]
+  , p "time" [1,12,2]
+  , p "transformers" [0,6,1,0]
+  , p "unix" [2,8,4,0]
+  ]
+
+ghc963_pkgs :: [Cabal.PackageIdentifier]
+ghc963_pkgs =
+  [ p "array" [0,5,5,0]
+  , p "base" [4,18,1,0]
+  , p "binary" [0,8,9,1]
+  , p "bytestring" [0,11,5,2]
+  , p "containers" [0,6,7]
+  , p "deepseq" [1,4,8,1]
+  , p "directory" [1,3,8,1]
+  , p "exceptions" [0,10,7]
+  , p "filepath" [1,4,100,4]
+  , p "ghc-bignum" [1,3]
+  , p "ghc-compact" [0,1,0,0]
+  , p "ghc-prim" [0,10,0]
+  , p "hpc" [0,6,2,0]
+  , p "integer-gmp" [1,1]
+  , p "mtl" [2,3,1]
+  , p "pretty" [1,1,3,6]
+  , p "process" [1,6,17,0]
+  , p "stm" [2,5,1,0]
+  , p "template-haskell" [2,20,0,0]
+  , p "terminfo" [0,4,1,6]
+  , p "time" [1,12,2]
+  , p "transformers" [0,6,1,0]
+  , p "unix" [2,8,1,0]
+  ]
+
+ghc962_pkgs :: [Cabal.PackageIdentifier]
+ghc962_pkgs =
+  [ p "array" [0,5,5,0]
+  , p "base" [4,18,0,0]
+  , p "binary" [0,8,9,1] -- used by libghc
+  , p "bytestring" [0,11,5,1] -- MUST BE PATCHED on ghc-9.6.2
+--  , p "Cabal" [3,6,3,0]  package is upgradeable
+  , p "containers" [0,6,7]
+  , p "deepseq" [1,4,8,1] -- used by time
+  , p "directory" [1,3,8,1]
+  , p "exceptions" [0,10,7] -- used by libghc
+  , p "filepath" [1,4,100,1]
+  , p "ghc-bignum" [1,3]
+  , p "ghc-compact" [0,1,0,0]
+  , p "ghc-prim" [0,10,0]
+--  , p "haskeline" [0,8,2]  package is upgradeable
+  , p "hpc" [0,6,2,0] -- used by libghc
+  , p "integer-gmp" [1,1]
+  , p "mtl" [2,3,1]  -- used by exceptions
+--   , p "parsec" [3,1,15,0]  -- package is upgradeable
+  , p "pretty" [1,1,3,6]
+  , p "process" [1,6,17,0]
+  , p "stm" [2,5,1,0]
+  , p "template-haskell" [2,20,0,0] -- used by libghc
+  , p "terminfo" [0,4,1,6] -- used by libghc
+--   , p "text" [1,2,5,0] -- package is upgradeable
+  , p "time" [1,12,2] -- used by unix, directory, hpc, ghc. unsafe to upgrade
+  , p "transformers" [0,6,1,0] -- used by libghc
+  , p "unix" [2,8,1,0]
+--  , p "xhtml" [3000,2,2,1]
+  ]
+
+ghc948_pkgs :: [Cabal.PackageIdentifier]
+ghc948_pkgs =
+  [ p "array" [0,5,4,0]
+  , p "base" [4,17,2,1]
+  , p "binary" [0,8,9,1]
+  , p "bytestring" [0,11,5,3]
+  , p "containers" [0,6,7]
+  , p "deepseq" [1,4,8,0]
+  , p "directory" [1,3,7,1]
+  , p "exceptions" [0,10,5]
+  , p "filepath" [1,4,2,2]
+  , p "ghc-bignum" [1,3]
+  , p "ghc-compact" [0,1,0,0]
+  , p "ghc-prim" [0,9,1]
+  , p "hpc" [0,6,1,0]
+  , p "integer-gmp" [1,1]
+  , p "mtl" [2,2,2]
+  , p "pretty" [1,1,3,6]
+  , p "process" [1,6,18,0]
+  , p "stm" [2,5,1,0]
+  , p "template-haskell" [2,19,0,0]
+  , p "terminfo" [0,4,1,5]
+  , p "time" [1,12,2]
+  , p "transformers" [0,5,6,2]
+  , p "unix" [2,7,3]
+  ]
+
+ghc947_pkgs :: [Cabal.PackageIdentifier]
+ghc947_pkgs =
+  [ p "array" [0,5,4,0]
+  , p "base" [4,17,2,0]
+  , p "binary" [0,8,9,1]
+  , p "bytestring" [0,11,5,2]
+  , p "containers" [0,6,7]
+  , p "deepseq" [1,4,8,0]
+  , p "directory" [1,3,7,1]
+  , p "exceptions" [0,10,5]
+  , p "filepath" [1,4,2,2]
+  , p "ghc-bignum" [1,3]
+  , p "ghc-compact" [0,1,0,0]
+  , p "ghc-prim" [0,9,1]
+  , p "hpc" [0,6,1,0]
+  , p "integer-gmp" [1,1]
+  , p "mtl" [2,2,2]
+  , p "pretty" [1,1,3,6]
+  , p "process" [1,6,17,0]
+  , p "stm" [2,5,1,0]
+  , p "template-haskell" [2,19,0,0]
+  , p "terminfo" [0,4,1,5]
+  , p "time" [1,12,2]
+  , p "transformers" [0,5,6,2]
+  , p "unix" [2,7,3]
+  ]
+
+ghc946_pkgs :: [Cabal.PackageIdentifier]
+ghc946_pkgs =
+  [ p "array" [0,5,4,0]
+  , p "base" [4,17,2,0]
+  , p "binary" [0,8,9,1] -- used by libghc
+  , p "bytestring" [0,11,5,1]
+--  , p "Cabal" [3,6,3,0]  package is upgradeable
+  , p "containers" [0,6,7]
+  , p "deepseq" [1,4,8,0] -- used by time
+  , p "directory" [1,3,7,1]
+  , p "exceptions" [0,10,5] -- used by libghc
+  , p "filepath" [1,4,2,2]
+  , p "ghc-bignum" [1,3]
+  , p "ghc-compact" [0,1,0,0]
+  , p "ghc-prim" [0,9,1]
+--  , p "haskeline" [0,8,2]  package is upgradeable
+  , p "hpc" [0,6,1,0] -- used by libghc
+  , p "integer-gmp" [1,1]
+  , p "mtl" [2,2,2]  -- used by exceptions
+--   , p "parsec" [3,1,15,0]  -- package is upgradeable
+  , p "pretty" [1,1,3,6]
+  , p "process" [1,6,17,0]
+  , p "stm" [2,5,1,0]
+  , p "template-haskell" [2,19,0,0] -- used by libghc
+  , p "terminfo" [0,4,1,5] -- used by libghc
+--   , p "text" [1,2,5,0] -- package is upgradeable
+  , p "time" [1,12,2] -- used by unix, directory, hpc, ghc. unsafe to upgrade
+  , p "transformers" [0,5,6,2] -- used by libghc
+  , p "unix" [2,7,3]
+--  , p "xhtml" [3000,2,2,1]
+  ]
+
+
+ghc945_pkgs :: [Cabal.PackageIdentifier]
+ghc945_pkgs =
+  [ p "array" [0,5,4,0]
+  , p "base" [4,17,1,0]
+  , p "binary" [0,8,9,1] -- used by libghc
+  , p "bytestring" [0,11,4,0]
+--  , p "Cabal" [3,6,3,0]  package is upgradeable
+  , p "containers" [0,6,7]
+  , p "deepseq" [1,4,8,0] -- used by time
+  , p "directory" [1,3,7,1]
+  , p "exceptions" [0,10,5] -- used by libghc
+  , p "filepath" [1,4,2,2]
+  , p "ghc-bignum" [1,3]
+  , p "ghc-compact" [0,1,0,0]
+  , p "ghc-prim" [0,9,0]
+--  , p "haskeline" [0,8,2]  package is upgradeable
+  , p "hpc" [0,6,1,0] -- used by libghc
+  , p "integer-gmp" [1,1]
+  , p "mtl" [2,2,2]  -- used by exceptions
+--   , p "parsec" [3,1,15,0]  -- package is upgradeable
+  , p "pretty" [1,1,3,6]
+  , p "process" [1,6,16,0]
+  , p "stm" [2,5,1,0]
+  , p "template-haskell" [2,19,0,0] -- used by libghc
+  , p "terminfo" [0,4,1,5] -- used by libghc
+--   , p "text" [1,2,5,0] -- package is upgradeable
+  , p "time" [1,12,2] -- used by unix, directory, hpc, ghc. unsafe to upgrade
+  , p "transformers" [0,5,6,2] -- used by libghc
+  , p "unix" [2,7,3]
+--  , p "xhtml" [3000,2,2,1]
+  ]
+
+ghc927_pkgs :: [Cabal.PackageIdentifier]
+ghc927_pkgs =
+  [ p "array" [0,5,4,0]
+  , p "base" [4,16,4,0]
+  , p "binary" [0,8,9,0] -- used by libghc
+  , p "bytestring" [0,11,4,0]
+--  , p "Cabal" [3,6,3,0]  package is upgradeable
+  , p "containers" [0,6,5,1]
+  , p "deepseq" [1,4,6,1] -- used by time
+  , p "directory" [1,3,6,2]
+  , p "exceptions" [0,10,4] -- used by libghc
+  , p "filepath" [1,4,2,2]
+  , p "ghc-bignum" [1,2]
+  , p "ghc-compact" [0,1,0,0]
+  , p "ghc-prim" [0,8,0]
+--  , p "haskeline" [0,8,2]  package is upgradeable
+  , p "hpc" [0,6,1,0] -- used by libghc
+  , p "integer-gmp" [1,1]
+  , p "mtl" [2,2,2]  -- used by exceptions
+--   , p "parsec" [3,1,15,0]  -- package is upgradeable
+  , p "pretty" [1,1,3,6]
+  , p "process" [1,6,16,0]
+  , p "stm" [2,5,0,2]
+  , p "template-haskell" [2,18,0,0] -- used by libghc
+  , p "terminfo" [0,4,1,5] -- used by libghc
+--   , p "text" [1,2,5,0] -- package is upgradeable
+  , p "time" [1,11,1,1] -- used by unix, directory, hpc, ghc. unsafe to upgrade
+  , p "transformers" [0,5,6,2] -- used by libghc
+  , p "unix" [2,7,2,2]
+--  , p "xhtml" [3000,2,2,1]
+  ]
+
 ghc926_pkgs :: [Cabal.PackageIdentifier]
 ghc926_pkgs =
   [ p "array" [0,5,4,0]
@@ -197,12 +470,8 @@
   , p "exceptions" [0,10,4] -- used by libghc
   , p "filepath" [1,4,2,1]
   , p "ghc-bignum" [1,2]
-  , p "ghc-boot" [9,2,6]
-  , p "ghc-boot-th" [9,2,6]
   , p "ghc-compact" [0,1,0,0]
   , p "ghc-prim" [0,8,0]
-  , p "ghc-heap" [9,2,6]
-  , p "ghci" [9,2,6]
 --  , p "haskeline" [0,8,2]  package is upgradeable
   , p "hpc" [0,6,1,0] -- used by libghc
   , p "integer-gmp" [1,1]
@@ -233,12 +502,8 @@
   , p "exceptions" [0,10,4] -- used by libghc
   , p "filepath" [1,4,2,1]
   , p "ghc-bignum" [1,2]
-  , p "ghc-boot" [9,2,5]
-  , p "ghc-boot-th" [9,2,5]
   , p "ghc-compact" [0,1,0,0]
   , p "ghc-prim" [0,8,0]
-  , p "ghc-heap" [9,2,5]
-  , p "ghci" [9,2,5]
 --  , p "haskeline" [0,8,2]  package is upgradeable
   , p "hpc" [0,6,1,0] -- used by libghc
   , p "integer-gmp" [1,1]
@@ -269,12 +534,8 @@
   , p "exceptions" [0,10,4] -- used by libghc
   , p "filepath" [1,4,2,1]
   , p "ghc-bignum" [1,2]
-  , p "ghc-boot" [9,2,4]
-  , p "ghc-boot-th" [9,2,4]
   , p "ghc-compact" [0,1,0,0]
   , p "ghc-prim" [0,8,0]
-  , p "ghc-heap" [9,2,4]
-  , p "ghci" [9,2,4]
 --  , p "haskeline" [0,8,2]  package is upgradeable
   , p "hpc" [0,6,1,0] -- used by libghc
   , p "integer-gmp" [1,1]
@@ -305,12 +566,8 @@
   , p "filepath" [1,4,2,1]
   , p "exceptions" [0,10,4] -- used by libghc
   , p "ghc-bignum" [1,1]
-  , p "ghc-boot" [9,0,2]
-  , p "ghc-boot-th" [9,0,2]
   , p "ghc-compact" [0,1,0,0]
   , p "ghc-prim" [0,7,0]
-  , p "ghc-heap" [9,0,2]
-  , p "ghci" [9,0,2]
 --  , p "haskeline" [0,8,2]  package is upgradeable
   , p "hpc" [0,6,1,0] -- used by libghc
   , p "integer-gmp" [1,1]
@@ -322,210 +579,6 @@
   , p "template-haskell" [2,17,0,0] -- used by libghc
   , p "terminfo" [0,4,1,5] -- used by libghc
 --   , p "text" [1,2,5,0] -- package is upgradeable
-  , p "time" [1,9,3,0] -- used by unix, directory, hpc, ghc. unsafe to upgrade
-  , p "transformers" [0,5,6,2] -- used by libghc
-  , p "unix" [2,7,2,2]
---  , p "xhtml" [3000,2,2,1]
-  ]
-
-ghc8106_pkgs :: [Cabal.PackageIdentifier]
-ghc8106_pkgs =
-  [ p "array" [0,5,4,0]
-  , p "base" [4,14,1,0]
-  , p "binary" [0,8,8,0] -- used by libghc
-  , p "bytestring" [0,10,12,0]
---  , p "Cabal" [3,2,1,0]  package is upgradeable
-  , p "containers" [0,6,2,1]
-  , p "deepseq" [1,4,4,0] -- used by time
-  , p "directory" [1,3,6,0]
-  , p "filepath" [1,4,2,1]
-  , p "exceptions" [0,10,4] -- used by libghc in ghc-9.0.2
-  , p "ghc-boot" [8,10,4]
-  , p "ghc-boot-th" [8,10,4]
-  , p "ghc-compact" [0,1,0,0]
-  , p "ghc-prim" [0,6,1,0]
-  , p "ghc-heap" [8,10,4]
-  , p "ghci" [8,10,4]
---  , p "haskeline" [0,8,0,1]  package is upgradeable
-  , p "hpc" [0,6,1,0] -- used by libghc
-  , p "integer-gmp" [1,0,3,0]
-  , p "mtl" [2,2,2]  -- used by exceptions in ghc-9.0.2
---   , p "parsec" [3,1,14,0]  -- package is upgradeable
-  , p "pretty" [1,1,3,6]
-  , p "process" [1,6,16,0]
-  , p "stm" [2,5,0,0]
-  , p "template-haskell" [2,16,0,0] -- used by libghc
-  , p "terminfo" [0,4,1,4] -- used by libghc in ghc-9.0.2
---   , p "text" [1,2,4,1] -- package is upgradeable
-  , p "time" [1,9,3,0] -- used by unix, directory, hpc, ghc. unsafe to upgrade
-  , p "transformers" [0,5,6,2] -- used by libghc
-  , p "unix" [2,7,2,2]
---  , p "xhtml" [3000,2,2,1]
-  ]
-
-ghc8104_pkgs :: [Cabal.PackageIdentifier]
-ghc8104_pkgs =
-  [ p "array" [0,5,4,0]
-  , p "base" [4,14,1,0]
-  , p "binary" [0,8,8,0] -- used by libghc
-  , p "bytestring" [0,10,12,0]
---  , p "Cabal" [3,2,1,0]  package is upgradeable
-  , p "containers" [0,6,2,1]
-  , p "deepseq" [1,4,4,0] -- used by time
-  , p "directory" [1,3,6,0]
-  , p "filepath" [1,4,2,1]
-  , p "exceptions" [0,10,4] -- used by libghc in ghc-9.0.2
-  , p "ghc-boot" [8,10,4]
-  , p "ghc-boot-th" [8,10,4]
-  , p "ghc-compact" [0,1,0,0]
-  , p "ghc-prim" [0,6,1,0]
-  , p "ghc-heap" [8,10,4]
-  , p "ghci" [8,10,4]
---  , p "haskeline" [0,8,0,1]  package is upgradeable
-  , p "hpc" [0,6,1,0] -- used by libghc
-  , p "integer-gmp" [1,0,3,0]
-  , p "mtl" [2,2,2]  -- used by exceptions in ghc-9.0.2
---   , p "parsec" [3,1,14,0]  -- package is upgradeable
-  , p "pretty" [1,1,3,6]
-  , p "process" [1,6,9,0]
-  , p "stm" [2,5,0,0]
-  , p "template-haskell" [2,16,0,0] -- used by libghc
-  , p "terminfo" [0,4,1,4] -- used by libghc in ghc-9.0.2
---   , p "text" [1,2,4,1] -- package is upgradeable
-  , p "time" [1,9,3,0] -- used by unix, directory, hpc, ghc. unsafe to upgrade
-  , p "transformers" [0,5,6,2] -- used by libghc
-  , p "unix" [2,7,2,2]
---  , p "xhtml" [3000,2,2,1]
-  ]
-
-ghc8101_pkgs :: [Cabal.PackageIdentifier]
-ghc8101_pkgs =
-  [ p "array" [0,5,4,0]
-  , p "base" [4,14,0,0]
-  , p "binary" [0,8,8,0] -- used by libghc
-  , p "bytestring" [0,10,10,0]
---  , p "Cabal" [3,2,0,0]  package is upgradeable
-  , p "containers" [0,6,2,1]
-  , p "deepseq" [1,4,4,0] -- used by time
-  , p "directory" [1,3,6,0]
-  , p "filepath" [1,4,2,1]
-  , p "exceptions" [0,10,4] -- used by libghc in ghc-9.0.2
-  , p "ghc-boot" [8,10,1]
-  , p "ghc-boot-th" [8,10,1]
-  , p "ghc-compact" [0,1,0,0]
-  , p "ghc-prim" [0,6,1,0]
-  , p "ghc-heap" [8,10,1]
-  , p "ghci" [8,10,1]
---  , p "haskeline" [0,8,0,0]  package is upgradeable
-  , p "hpc" [0,6,1,0] -- used by libghc
-  , p "integer-gmp" [1,0,3,0]
-  , p "mtl" [2,2,2]  -- used by libghc in ghc-9.0.2 
---   , p "parsec" [3,1,14,0]  -- package is upgradeable
-  , p "pretty" [1,1,3,6]
-  , p "process" [1,6,8,2]
-  , p "stm" [2,5,0,0]
-  , p "template-haskell" [2,16,0,0] -- used by libghc
-  , p "terminfo" [0,4,1,4]  -- used by libghc in ghc-9.0.2
---   , p "text" [1,2,3,2]  -- package is upgradeable
-  , p "time" [1,9,3,0] -- used by unix, directory, hpc, ghc. unsafe to upgrade
-  , p "transformers" [0,5,6,2] -- used by libghc
-  , p "unix" [2,7,2,2]
---  , p "xhtml" [3000,2,2,1]
-  ]
-
-ghc884_pkgs :: [Cabal.PackageIdentifier]
-ghc884_pkgs =
-  [ p "array" [0,5,4,0]
-  , p "base" [4,13,0,0]
-  , p "binary" [0,8,7,0] -- used by libghc
-  , p "bytestring" [0,10,10,1]
---  , p "Cabal" [3,0,1,0]  package is upgradeable
-  , p "containers" [0,6,2,1]
-  , p "deepseq" [1,4,4,0] -- used by time
-  , p "directory" [1,3,6,0]
-  , p "filepath" [1,4,2,1]
-  , p "ghc-boot" [8,8,4]
-  , p "ghc-boot-th" [8,8,4]
-  , p "ghc-compact" [0,1,0,0]
-  , p "ghc-prim" [0,5,3,0]
-  , p "ghci" [8,8,4]
---  , p "haskeline" [0,7,5,0]  package is upgradeable
-  , p "hpc" [0,6,0,3] -- used by libghc
-  , p "integer-gmp" [1,0,2,0]
-  , p "mtl" [2,2,2]  -- used by exceptions in ghc-9.0.2
---   , p "parsec" [3,1,14,0] -- package is upgradeable
-  , p "pretty" [1,1,3,6]
-  , p "process" [1,6,9,0]
-  , p "stm" [2,5,0,0]
-  , p "template-haskell" [2,15,0,0] -- used by libghc
-  , p "terminfo" [0,4,1,4] -- used by libghc in ghc-9.0.2
---   , p "text" [1,2,4,0] -- package is upgradeable
-  , p "time" [1,9,3,0] -- used by unix, directory, hpc, ghc. unsafe to upgrade
-  , p "transformers" [0,5,6,2] -- used by libghc
-  , p "unix" [2,7,2,2]
---  , p "xhtml" [3000,2,2,1]
-  ]
-
-ghc883_pkgs :: [Cabal.PackageIdentifier]
-ghc883_pkgs =
-  [ p "array" [0,5,4,0]
-  , p "base" [4,13,0,0]
-  , p "binary" [0,8,7,0] -- used by libghc
-  , p "bytestring" [0,10,10,0]
---  , p "Cabal" [3,0,1,0]  package is upgradeable
-  , p "containers" [0,6,2,1]
-  , p "deepseq" [1,4,4,0] -- used by time
-  , p "directory" [1,3,6,0]
-  , p "filepath" [1,4,2,1]
-  , p "ghc-boot" [8,8,3]
-  , p "ghc-boot-th" [8,8,3]
-  , p "ghc-compact" [0,1,0,0]
-  , p "ghc-prim" [0,5,3,0]
-  , p "ghci" [8,8,3]
---  , p "haskeline" [0,7,5,0]  package is upgradeable
-  , p "hpc" [0,6,0,3] -- used by libghc
-  , p "integer-gmp" [1,0,2,0]
-  , p "mtl" [2,2,2] -- used by exceptions in ghc-9.0.2
---   , p "parsec" [3,1,14,0] -- package is upgradeable
-  , p "pretty" [1,1,3,6]
-  , p "process" [1,6,8,0]
-  , p "stm" [2,5,0,0]
-  , p "template-haskell" [2,15,0,0] -- used by libghc
-  , p "terminfo" [0,4,1,4] -- used by libghc in ghc-9.0.2
---   , p "text" [1,2,4,0] -- package is upgradeable
-  , p "time" [1,9,3,0] -- used by unix, directory, hpc, ghc. unsafe to upgrade
-  , p "transformers" [0,5,6,2] -- used by libghc
-  , p "unix" [2,7,2,2]
---  , p "xhtml" [3000,2,2,1]
-  ]
-
-ghc881_pkgs :: [Cabal.PackageIdentifier]
-ghc881_pkgs =
-  [ p "array" [0,5,4,0]
-  , p "base" [4,13,0,0]
-  , p "binary" [0,8,7,0] -- used by libghc
-  , p "bytestring" [0,10,9,0]
---  , p "Cabal" [3,0,0,0]  package is upgradeable
-  , p "containers" [0,6,2,1]
-  , p "deepseq" [1,4,4,0] -- used by time
-  , p "directory" [1,3,3,2]
-  , p "filepath" [1,4,2,1]
-  , p "ghc-boot" [8,8,1]
-  , p "ghc-boot-th" [8,8,1]
-  , p "ghc-compact" [0,1,0,0]
-  , p "ghc-prim" [0,5,3,0]
-  , p "ghci" [8,8,1]
---  , p "haskeline" [0,7,4,3]  package is upgradeable
-  , p "hpc" [0,6,0,3] -- used by libghc
-  , p "integer-gmp" [1,0,2,0]
-  , p "mtl" [2,2,2] -- used by exceptions in ghc-9.0.2
---   , p "parsec" [3,1,14,0] -- package is upgradeable
-  , p "pretty" [1,1,3,6]
-  , p "process" [1,6,5,1]
-  , p "stm" [2,5,0,0]
-  , p "template-haskell" [2,15,0,0] -- used by libghc
-  , p "terminfo" [0,4,1,4] -- used by libghc in ghc-9.0.2
---   , p "text" [1,2,4,0] -- package is upgradeable
   , p "time" [1,9,3,0] -- used by unix, directory, hpc, ghc. unsafe to upgrade
   , p "transformers" [0,5,6,2] -- used by libghc
   , p "unix" [2,7,2,2]
diff --git a/src/Portage/Tables.hs b/src/Portage/Tables.hs
deleted file mode 100644
--- a/src/Portage/Tables.hs
+++ /dev/null
@@ -1,37 +0,0 @@
-{-|
-Module      : Portage.Tables
-License     : GPL-3+
-Maintainer  : haskell@gentoo.org
-
-Tables of Portage-specific conversions.
--}
-module Portage.Tables
-  ( set_build_slot
-  ) where
-
-import Portage.Dependency.Builder
-import Portage.Dependency.Types
-import Portage.PackageId
-
-import Data.Monoid
-
--- | Set the @SLOT@ for a given 'Dependency'.
-set_build_slot :: Dependency -> Dependency
-set_build_slot = 
-  overAtom $ \a@(Atom pn dr (DAttr _ u)) -> 
-      case mconcat $ map (First . matches a) slottedPkgs of
-          First (Just s) -> Atom pn dr (DAttr s u)
-          First Nothing  -> Atom pn dr (DAttr AnyBuildTimeSlot u)
-    where
-      matches (Atom pn _ _) (nm,s) 
-        | pn == nm  = Just s
-        | otherwise = Nothing
-
--- | List of 'PackageName's with their corresponding default 'SlotDepend's.
---
--- For example, dependency @QuickCheck@ has its @SLOT@ always set to @2@.
-slottedPkgs :: [(PackageName, SlotDepend)]
-slottedPkgs =
-  [ (mkPackageName "dev-haskell" "quickcheck", GivenSlot "2=")
-  , (mkPackageName "dev-haskell" "hdbc", GivenSlot "2=")
-  ]
diff --git a/src/Portage/Use.hs b/src/Portage/Use.hs
--- a/src/Portage/Use.hs
+++ b/src/Portage/Use.hs
@@ -57,7 +57,7 @@
 
 dispUses :: [UseFlag] -> Disp.Doc
 dispUses [] = Disp.empty
-dispUses us = Disp.brackets $ Disp.hcat $ (Disp.punctuate (Disp.text ", ")) $ map pretty us
+dispUses us = Disp.brackets $ Disp.hcat $ (Disp.punctuate (Disp.text ",")) $ map pretty us
 
 newtype Use = Use String
     deriving (Eq, Read, Show)
diff --git a/tests/spec/Merge/UtilsSpec.hs b/tests/spec/Merge/UtilsSpec.hs
--- a/tests/spec/Merge/UtilsSpec.hs
+++ b/tests/spec/Merge/UtilsSpec.hs
@@ -1,10 +1,14 @@
+{-# LANGUAGE CPP #-}
+
 module Merge.UtilsSpec (spec) where
 
 import           Test.Hspec
 import           Test.Hspec.QuickCheck
 import           QuickCheck.Instances
 
+#if !MIN_VERSION_base(4,18,0)
 import           Control.Applicative (liftA2)
+#endif
 import qualified Data.Map.Strict as Map
 import           Data.Maybe (catMaybes)
 import qualified Data.List as L
diff --git a/tests/spec/Portage/GHCCoreSpec.hs b/tests/spec/Portage/GHCCoreSpec.hs
--- a/tests/spec/Portage/GHCCoreSpec.hs
+++ b/tests/spec/Portage/GHCCoreSpec.hs
@@ -11,7 +11,7 @@
 spec = do
   describe "cabalFromGHC" $ do
     it "returns the corresponding Cabal version for a valid GHC version" $ do
-      cabalFromGHC [8,8,3] `shouldBe` Just (Cabal.mkVersion [3,0,1,0])
+      cabalFromGHC [9,2,7] `shouldBe` Just (Cabal.mkVersion [3,6,3,0])
     it "returns Nothing for an invalid GHC version" $ do
       cabalFromGHC [9,9,9,9] `shouldBe` Nothing
   describe "packageIsCoreInAnyGHC" $ do
