diff --git a/CHANGES.md b/CHANGES.md
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,3 +1,10 @@
+## [v0.4.1](https://github.com/diagrams/diagrams-haddock/tree/v0.4.1) (2021-08-12)
+
+- Allow `base-4.15`, `bytestring-0.11`, `strict-0.4`, `lens-5.0`,
+  `base64-bytestring-1.2`, `ansi-terminal-0.11`, `Cabal-3.4`,
+  `QuickCheck-2.14`, `tasty-1.4`
+- Switch from `cautious-file` to `unliftio` package for safe file writing.
+
 ## [v0.4.0.3](https://github.com/diagrams/diagrams-haddock/tree/v0.4.0.3) (2019-02-09)
 
 More upper bound updates:
diff --git a/diagrams-haddock.cabal b/diagrams-haddock.cabal
--- a/diagrams-haddock.cabal
+++ b/diagrams-haddock.cabal
@@ -1,5 +1,5 @@
 name:                diagrams-haddock
-version:             0.4.0.3
+version:             0.4.1
 synopsis:            Preprocessor for embedding diagrams in Haddock documentation
 description:         diagrams-haddock is a tool for compiling embedded inline
                      diagrams code in Haddock documentation, for an
@@ -26,7 +26,7 @@
 cabal-version:       1.18
 extra-source-files:  README.md, CHANGES.md, diagrams/*.svg
 extra-doc-files:     diagrams/*.svg
-tested-with:         GHC == 7.10.2, GHC == 8.0.1
+tested-with:         GHC ==8.4.4 || ==8.6.5 || ==8.8.4 || ==8.10.4 || ==9.0.1
 
 Source-repository head
   type: git
@@ -35,28 +35,28 @@
 library
   exposed-modules:     Diagrams.Haddock
   other-modules:       Paths_diagrams_haddock
-  build-depends:       base >= 4.4 && < 4.13,
+  build-depends:       base >= 4.4 && < 4.16,
                        filepath,
                        directory,
                        mtl >= 2.0 && < 2.3,
                        containers >= 0.4 && < 0.7,
                        split >= 0.2 && < 0.3,
-                       bytestring >= 0.9 && < 0.11,
-                       strict >= 0.3 && < 0.4,
+                       bytestring >= 0.9 && < 0.12,
+                       strict >= 0.3 && < 0.5,
                        parsec >= 3,
-                       haskell-src-exts >= 1.18 && < 1.21,
+                       haskell-src-exts >= 1.18 && < 1.24,
                        svg-builder >= 0.1 && < 0.2,
                        diagrams-builder >= 0.5 && < 0.9,
                        diagrams-lib >= 1.4 && < 1.5,
                        diagrams-svg >= 1.4 && < 1.5,
-                       lens >= 3.8 && < 4.18,
-                       linear >= 1.10 && < 1.21,
+                       lens >= 3.8 && < 5.1,
+                       linear >= 1.10 && < 1.22,
                        cpphs >= 1.15,
-                       cautious-file >= 1.0 && < 1.1,
+                       unliftio >= 0.2.12 && < 0.3,
                        uniplate >= 1.6 && < 1.7,
                        text >= 0.11 && < 1.3,
-                       base64-bytestring >= 1 && < 1.1,
-                       ansi-terminal >= 0.5 && < 0.9
+                       base64-bytestring >= 1 && < 1.3,
+                       ansi-terminal >= 0.5 && < 0.12
   hs-source-dirs:      src
   other-extensions:    TemplateHaskell
   default-language:    Haskell2010
@@ -69,7 +69,7 @@
                        filepath,
                        diagrams-haddock,
                        cmdargs >= 0.8 && < 0.11,
-                       Cabal >= 1.14 && < 2.5,
+                       Cabal >= 1.14 && < 3.5,
                        cpphs >= 1.15
   hs-source-dirs:      tools
   default-language:    Haskell2010
@@ -79,12 +79,12 @@
   main-is:             Tests.hs
   build-depends:       base,
                        containers >= 0.4 && < 0.7,
-                       QuickCheck >= 2.4 && < 2.13,
-                       tasty >= 0.8 && < 1.3,
+                       QuickCheck >= 2.4 && < 2.15,
+                       tasty >= 0.8 && < 1.5,
                        tasty-quickcheck >= 0.8 && < 0.11,
                        parsec >= 3,
-                       lens >= 3.8 && < 4.18,
-                       haskell-src-exts >= 1.18 && < 1.21,
+                       lens >= 3.8 && < 5.1,
+                       haskell-src-exts >= 1.18 && < 1.24,
                        diagrams-haddock
   hs-source-dirs:      test
   default-language:    Haskell2010
diff --git a/src/Diagrams/Haddock.hs b/src/Diagrams/Haddock.hs
--- a/src/Diagrams/Haddock.hs
+++ b/src/Diagrams/Haddock.hs
@@ -91,8 +91,8 @@
 import qualified Data.Map                    as M
 import           Data.Maybe                  (catMaybes, mapMaybe)
 import qualified Data.Set                    as S
-import qualified Data.Text.Lazy              as T
-import qualified Data.Text.Lazy.Encoding     as T
+import qualified Data.Text                   as T
+import qualified Data.Text.Encoding          as T
 import qualified Graphics.Svg                as G
 import           Language.Haskell.Exts       hiding (loc)
 import qualified Language.Haskell.Exts       as HSE
@@ -104,11 +104,11 @@
 import           System.FilePath             (dropExtension, normalise,
                                               splitDirectories, (<.>), (</>))
 import qualified System.IO                   as IO
-import qualified System.IO.Cautious          as Cautiously
 import qualified System.IO.Strict            as Strict
 import           Text.Parsec
 import qualified Text.Parsec                 as P
 import           Text.Parsec.String
+import qualified UnliftIO.IO.File            as UIO
 
 import           Diagrams.Backend.SVG        (Options (..), SVG (..))
 import qualified Diagrams.Builder            as DB
@@ -323,17 +323,17 @@
 getBinding :: Decl l -> Maybe String
 getBinding (FunBind _ [])                     = Nothing
 getBinding (FunBind _ (Match _ nm _ _ _ : _)) = Just $ getName nm
-getBinding (PatBind _ (PVar _ nm) _ _)      = Just $ getName nm
+getBinding (PatBind _ (PVar _ nm) _ _)        = Just $ getName nm
 getBinding _                                  = Nothing
 
 getName :: Name l -> String
-getName (HSE.Ident _ s)  = s
-getName (Symbol _ s) = s
+getName (HSE.Ident _ s) = s
+getName (Symbol _ s)    = s
 
 getQName :: QName l -> Maybe String
 getQName (Qual _ _ n) = Just $ getName n
 getQName (UnQual _ n) = Just $ getName n
-getQName _          = Nothing
+getQName _            = Nothing
 
 -- | Collect the list of referenced identifiers in a module.
 collectIdents :: Module SrcSpanInfo -> S.Set String
@@ -571,11 +571,7 @@
                 compileDiagrams quiet dataURIs cacheDir outputDir file ds cs urls
               let src' = displayDiagramURLs urls'
 
-              -- See https://github.com/diagrams/diagrams-haddock/issues/8:
-              -- Cautiously.writeFile truncates chars to 8 bits.  So
-              -- we do the encoding to UTF-8 ourselves and then call
-              -- writeFileL.
-              when changed $ Cautiously.writeFileL file (T.encodeUtf8 . T.pack $ src')
+              when changed $ UIO.writeBinaryFileDurableAtomic file (T.encodeUtf8 . T.pack $ src')
               return (msgs ++ msgs2)
   where
     go src | needsCPP src = runCpp src >>= return . runCE . parseCodeBlocks file
