diff --git a/Distribution/Client/HashValue.hs b/Distribution/Client/HashValue.hs
--- a/Distribution/Client/HashValue.hs
+++ b/Distribution/Client/HashValue.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP                #-}
 {-# LANGUAGE DeriveDataTypeable #-}
 {-# LANGUAGE DeriveGeneric      #-}
 module Distribution.Client.HashValue (
@@ -71,10 +72,14 @@
     --TODO: [code cleanup] either we should get TUF to use raw bytestrings or
     -- perhaps we should also just use a base16 string as the internal rep.
     case Base16.decode (BS.pack hashstr) of
+#if MIN_VERSION_base16_bytestring(1,0,0)
+      Right hash -> HashValue hash
+      Left _ -> error "hashFromTUF: cannot decode base16"
+#else
       (hash, trailing) | not (BS.null hash) && BS.null trailing
         -> HashValue hash
       _ -> error "hashFromTUF: cannot decode base16 hash"
-
+#endif
 
 -- | Truncate a 32 byte SHA256 hash to
 --
diff --git a/Distribution/Client/HttpUtils.hs b/Distribution/Client/HttpUtils.hs
--- a/Distribution/Client/HttpUtils.hs
+++ b/Distribution/Client/HttpUtils.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE BangPatterns #-}
+{-# LANGUAGE CPP          #-}
 -----------------------------------------------------------------------------
 -- | Separate module for HTTP actions, using a proxy server if one exists.
 -----------------------------------------------------------------------------
@@ -182,7 +183,12 @@
     fragmentParser = do
         _ <- P.string "#sha256="
         str <- some P.hexDigit
-        return (fst (Base16.decode (BS8.pack str)))
+        let bs = Base16.decode (BS8.pack str)
+#if MIN_VERSION_base16_bytestring(1,0,0)
+        either fail return bs
+#else
+        return (fst bs)
+#endif
 
 ------------------------------------------------------------------------------
 -- Utilities for repo url management
diff --git a/cabal-install.cabal b/cabal-install.cabal
--- a/cabal-install.cabal
+++ b/cabal-install.cabal
@@ -4,7 +4,7 @@
 -- To update this file, edit 'cabal-install.cabal.pp' and run
 -- 'make cabal-install-prod' in the project's root folder.
 Name:               cabal-install
-Version:            3.4.0.0
+Version:            3.4.1.0
 Synopsis:           The command-line interface for Cabal and Hackage.
 Description:
     The \'cabal\' command-line program simplifies the process of managing
@@ -337,10 +337,10 @@
         async      >= 2.0      && < 2.3,
         array      >= 0.4      && < 0.6,
         base       >= 4.8      && < 4.15,
-        base16-bytestring >= 0.1.1 && < 0.2,
+        base16-bytestring >= 0.1.1 && < 1.1.0.0,
         binary     >= 0.7.3    && < 0.9,
         bytestring >= 0.10.6.0 && < 0.11,
-        Cabal      == 3.4.*,
+        Cabal      == 3.4.1.*,
         containers >= 0.5.6.2  && < 0.7,
         cryptohash-sha256 >= 0.11 && < 0.12,
         deepseq    >= 1.4.1.1  && < 1.5,
diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,5 +1,8 @@
 -*-change-log-*-
 
+3.4.1.0 Emily Pillmore <emilypi@cohomolo.gy> October 2021
+	* See https://github.com/haskell/cabal/blob/master/release-notes/cabal-install-3.4.1.0.md
+
 3.4.0.0 Oleg Grenrus <oleg.grenrus@iki.fi> February 2021
 	* See https://github.com/haskell/cabal/blob/master/release-notes/cabal-install-3.4.0.0.md
 
