diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,8 +1,12 @@
 # Revision history for shh
 
+## 0.7.1.1 -- 2021-06-30
+
+* Changes to work on GHC 9
+
 ## 0.7.1.0 -- 2020-09-05
 
-* Assume UTF-8 encoding in places. This is a temporary workaroun until we
+* Assume UTF-8 encoding in places. This is a temporary workaround until we
   can remove all encoding assumptions.
 
 ## 0.7.0.8 -- 2020-05-28
diff --git a/shh.cabal b/shh.cabal
--- a/shh.cabal
+++ b/shh.cabal
@@ -1,5 +1,5 @@
 name:                shh
-version:             0.7.1.0
+version:             0.7.1.1
 synopsis:            Simple shell scripting from Haskell
 description:         Provides a shell scripting environment for Haskell. It
                      helps you use external binaries, and allows you to
@@ -23,7 +23,7 @@
   exposed-modules:     Shh
                      , Shh.Internal
   build-depends:
-    base             >= 4.9 && < 4.15,
+    base             >= 4.9 && < 4.16,
     async            >= 2.2.1 && < 2.3,
     bytestring,
     deepseq          >= 1.4.3 && < 1.5,
diff --git a/src/Shh/Internal.hs b/src/Shh/Internal.hs
--- a/src/Shh/Internal.hs
+++ b/src/Shh/Internal.hs
@@ -13,6 +13,7 @@
 {-# LANGUAGE QuasiQuotes #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE GADTs #-}
+{-# LANGUAGE CPP #-}
 
 -- | See documentation for "Shh".
 module Shh.Internal where
@@ -148,7 +149,7 @@
 
 
 -- | Use this to send the output of on process into the input of another.
--- This is just like a shells `|` operator.
+-- This is just like a shell's `|` operator.
 --
 -- The result is polymorphic in its output, and can result in either
 -- another `Proc a` or an `IO a` depending on the context in which it is
@@ -478,11 +479,11 @@
 captureEndBy :: Shell io => ByteString -> io [ByteString]
 captureEndBy s = readInput (pure . endBy s)
 
--- | Same as @'captureEndBy' "\0"@.
+-- | Same as @'captureEndBy' "\\0"@.
 captureEndBy0 :: Shell io => io [ByteString]
 captureEndBy0 = captureEndBy "\0"
 
--- | Same as @'captureSplit' "\n"@.
+-- | Same as @'captureSplit' "\\n"@.
 captureLines :: Shell io => io [ByteString]
 captureLines = captureEndBy "\n"
 
@@ -681,7 +682,7 @@
 -- >>> displayCommand $ echo "Hello, world!"
 -- ["echo","Hello, world!"]
 displayCommand :: Cmd -> [ByteString]
-displayCommand = toArgs
+displayCommand = \c -> toArgs c
 
 -- | Get all executables on your `$PATH`.
 pathBins :: IO [FilePath]
@@ -1032,7 +1033,11 @@
 
 -- | Helper function for duplicating a Handle
 dupHandleShh_
+#if __GLASGOW_HASKELL__ < 900
     :: (IODevice dev, BufferedIO dev, Typeable dev) => dev
+#else
+    :: (RawIO dev, IODevice dev, BufferedIO dev, Typeable dev) => dev
+#endif
     -> FilePath
     -> Maybe (MVar Handle__)
     -> Handle__
