diff --git a/Distribution/Simple/Utils.hs b/Distribution/Simple/Utils.hs
index 139ca8cb5f73806258c5c254a67999dfd4bac997..5e55608086850375d7e38222680b336c66c1a8af 100644
--- a/Distribution/Simple/Utils.hs
+++ b/Distribution/Simple/Utils.hs
@@ -137,7 +137,7 @@ import System.IO
 import System.IO.Error as IO.Error
     ( try )
 import qualified Control.Exception as Exception
-    ( bracket, bracket_, bracketOnError, catch, finally )
+    ( bracket, bracket_, catch, handle, finally, throwIO )
 
 import Distribution.Text
     ( display )
@@ -154,10 +154,6 @@ import System.Process (runInteractiveProcess, waitForProcess)
 import System.Cmd (system)
 import System.Directory (getTemporaryDirectory)
 #endif
-#if mingw32_HOST_OS || mingw32_TARGET_OS
-import qualified Control.Exception as Exception
-    ( throwIO )
-#endif
 
 import Distribution.Compat.TempFile (openTempFile, openBinaryTempFile)
 import Distribution.Verbosity
@@ -571,11 +567,10 @@ withTempDirectory verbosity tmpDir =
 --
 writeFileAtomic :: FilePath -> String -> IO ()
 writeFileAtomic targetFile content = do
-  Exception.bracketOnError
-    (openBinaryTempFile targetDir template)
-    (\(tmpFile, tmpHandle) -> IO.Error.try (hClose tmpHandle)
-                           >> IO.Error.try (removeFile tmpFile))
-    $ \(tmpFile, tmpHandle) -> do
+  (tmpFile, tmpHandle) <- openBinaryTempFile targetDir template
+  Exception.handle (\err -> do hClose tmpHandle
+                               removeFile tmpFile
+                               Exception.throwIO err) $ do
       hPutStr tmpHandle content
       hClose tmpHandle
 #if mingw32_HOST_OS || mingw32_TARGET_OS