diff --git a/Cabal/Cabal.cabal b/Cabal/Cabal.cabal
index 8c820f4ec690c1929e85112dc1ef7c54fbb0e8c8..88598a59f00283b7bf55a4597ca41daa2dffb1ec 100644
--- a/Cabal/Cabal.cabal
+++ b/Cabal/Cabal.cabal
@@ -141,6 +141,7 @@ library
 
   exposed-modules:
     Distribution.Compat.Environment
+    Distribution.Compat.Exception
     Distribution.Compat.ReadP
     Distribution.Compiler
     Distribution.InstalledPackageInfo
@@ -208,7 +209,6 @@ library
 
   other-modules:
     Distribution.Compat.CopyFile
-    Distribution.Compat.Exception
     Distribution.Compat.TempFile
     Distribution.GetOpt
     Distribution.Simple.GHC.IPI641
diff --git a/Cabal/Distribution/Compat/Exception.hs b/Cabal/Distribution/Compat/Exception.hs
index 2949b1635f780ec1487c8852372afee8dfe2f124..a1e3eeb18e33d3f985067a9c47ea9d30b2c1306d 100644
--- a/Cabal/Distribution/Compat/Exception.hs
+++ b/Cabal/Distribution/Compat/Exception.hs
@@ -1,12 +1,33 @@
+{-# LANGUAGE CPP #-}
 module Distribution.Compat.Exception (
-     catchIO,
-     catchExit,
-     tryIO,
+  mask,
+  mask_,
+  catchIO,
+  catchExit,
+  tryIO,
   ) where
 
 import System.Exit
 import qualified Control.Exception as Exception
 
+#if MIN_VERSION_base(4,3,0)
+-- it's much less of a headache if we re-export the "real" mask and mask_
+-- so there's never more than one definition to conflict
+import Control.Exception (mask, mask_)
+#else
+import Control.Exception (block, unblock)
+#endif
+
+#if !MIN_VERSION_base(4,3,0)
+-- note: less polymorphic than 'real' mask, to avoid RankNTypes
+-- we don't need the full generality where we use it
+mask :: ((IO a -> IO a) -> IO b) -> IO b
+mask handler = block (handler unblock)
+
+mask_ :: IO a -> IO a
+mask_ = block
+#endif
+
 tryIO :: IO a -> IO (Either Exception.IOException a)
 tryIO = Exception.try
 
diff --git a/cabal-install/Distribution/Client/Compat/Environment.hs b/cabal-install/Distribution/Client/Compat/Environment.hs
index 1070b767bc6122ad5710b71547f6ab8f7de22675..20a3f29c43553b8c86b783bfe2a15b6f00cecd95 100644
--- a/cabal-install/Distribution/Client/Compat/Environment.hs
+++ b/cabal-install/Distribution/Client/Compat/Environment.hs
@@ -33,7 +33,7 @@ import Foreign.C.Error (throwErrnoIfMinus1_)
 import System.Environment (lookupEnv)
 #else
 import System.Environment (getEnv)
-import Distribution.Client.Compat.Exception (catchIO)
+import Distribution.Compat.Exception (catchIO)
 #endif
 
 import System.Posix.Internals ( withFilePath )
diff --git a/cabal-install/Distribution/Client/Compat/Exception.hs b/cabal-install/Distribution/Client/Compat/Exception.hs
deleted file mode 100644
index b4896df6a950bb631e8830e690413c8824c7b455..0000000000000000000000000000000000000000
--- a/cabal-install/Distribution/Client/Compat/Exception.hs
+++ /dev/null
@@ -1,35 +0,0 @@
-{-# LANGUAGE CPP #-}
-{-# OPTIONS_HADDOCK hide #-}
-module Distribution.Client.Compat.Exception (
-  mask,
-  mask_,
-  catchIO,
-  catchExit,
-  ) where
-
-import System.Exit
-import qualified Control.Exception as Exception
-
-#if MIN_VERSION_base(4,3,0)
--- it's much less of a headache if we re-export the "real" mask and mask_
--- so there's never more than one definition to conflict
-import Control.Exception (mask, mask_)
-#else
-import Control.Exception (block, unblock)
-#endif
-
-#if !MIN_VERSION_base(4,3,0)
--- note: less polymorphic than 'real' mask, to avoid RankNTypes
--- we don't need the full generality where we use it
-mask :: ((IO a -> IO a) -> IO b) -> IO b
-mask handler = block (handler unblock)
-
-mask_ :: IO a -> IO a
-mask_ = block
-#endif
-
-catchIO :: IO a -> (Exception.IOException -> IO a) -> IO a
-catchIO = Exception.catch
-
-catchExit :: IO a -> (ExitCode -> IO a) -> IO a
-catchExit = Exception.catch
diff --git a/cabal-install/Distribution/Client/Compat/Semaphore.hs b/cabal-install/Distribution/Client/Compat/Semaphore.hs
index 71e4c818c73f149b656515d0baaf5f8ae573d2a6..274cc2e24464d2a891d321210ddabb2583cb018e 100644
--- a/cabal-install/Distribution/Client/Compat/Semaphore.hs
+++ b/cabal-install/Distribution/Client/Compat/Semaphore.hs
@@ -13,7 +13,7 @@ import Control.Exception (onException)
 import Control.Monad (join, when)
 import Data.Typeable (Typeable)
 
-import Distribution.Client.Compat.Exception (mask_)
+import Distribution.Compat.Exception (mask_)
 
 -- | 'QSem' is a quantity semaphore in which the resource is aqcuired
 -- and released in units of one. It provides guaranteed FIFO ordering
diff --git a/cabal-install/Distribution/Client/Config.hs b/cabal-install/Distribution/Client/Config.hs
index 12ee5f03953bf2d1a949731f97e5a890aab30ff9..2e5267ed8a5483c9c8bc9b6f42ecc517a37557d3 100644
--- a/cabal-install/Distribution/Client/Config.hs
+++ b/cabal-install/Distribution/Client/Config.hs
@@ -100,11 +100,11 @@ import Network.URI
          ( URI(..), URIAuth(..) )
 import System.FilePath
          ( (<.>), (</>), takeDirectory )
-import Distribution.Compat.Environment
-         ( getEnvironment )
 import System.IO.Error
          ( isDoesNotExistError )
-import Distribution.Client.Compat.Exception
+import Distribution.Compat.Environment
+         ( getEnvironment )
+import Distribution.Compat.Exception
          ( catchIO )
 
 --
diff --git a/cabal-install/Distribution/Client/IndexUtils.hs b/cabal-install/Distribution/Client/IndexUtils.hs
index 50950fe0fb55cd8999aeeeaf8758c12708716155..158cad3b02bd6462725d7d4166fefb5ea6f7f12b 100644
--- a/cabal-install/Distribution/Client/IndexUtils.hs
+++ b/cabal-install/Distribution/Client/IndexUtils.hs
@@ -70,7 +70,7 @@ import qualified Data.ByteString.Char8 as BSS
 import Data.ByteString.Lazy (ByteString)
 import Distribution.Client.GZipUtils (maybeDecompress)
 import Distribution.Client.Utils (byteStringToFilePath)
-import Distribution.Client.Compat.Exception (catchIO)
+import Distribution.Compat.Exception (catchIO)
 import Distribution.Client.Compat.Time
 import System.FilePath ((</>), takeExtension, splitDirectories, normalise)
 import System.FilePath.Posix as FilePath.Posix
diff --git a/cabal-install/Distribution/Client/Install.hs b/cabal-install/Distribution/Client/Install.hs
index 2b84250a4f9fc9d05f3dbe99abfcc2db8a998b80..24068f9224c23f73812a9cbd90fdfd3f2bb135f3 100644
--- a/cabal-install/Distribution/Client/Install.hs
+++ b/cabal-install/Distribution/Client/Install.hs
@@ -37,7 +37,7 @@ import Control.Exception as Exception
          , IOException, SomeException )
 import System.Exit
          ( ExitCode )
-import Distribution.Client.Compat.Exception
+import Distribution.Compat.Exception
          ( catchIO, catchExit )
 import Control.Monad
          ( when, unless )
diff --git a/cabal-install/Distribution/Client/InstallSymlink.hs b/cabal-install/Distribution/Client/InstallSymlink.hs
index c8eac4ed014c00611730f58a6ed088ac74f7cb38..b51a5fb14dd38ad174154b003c39973b2df165d8 100644
--- a/cabal-install/Distribution/Client/InstallSymlink.hs
+++ b/cabal-install/Distribution/Client/InstallSymlink.hs
@@ -65,7 +65,7 @@ import System.FilePath
 import Prelude hiding (ioError)
 import System.IO.Error
          ( isDoesNotExistError, ioError )
-import Distribution.Client.Compat.Exception ( catchIO )
+import Distribution.Compat.Exception ( catchIO )
 import Control.Exception
          ( assert )
 import Data.Maybe
diff --git a/cabal-install/Distribution/Client/JobControl.hs b/cabal-install/Distribution/Client/JobControl.hs
index 4f8229c00af211443c80314424d14fa7fec8e5a9..326f8e04df30e117f0d922b3213f3c807231001f 100644
--- a/cabal-install/Distribution/Client/JobControl.hs
+++ b/cabal-install/Distribution/Client/JobControl.hs
@@ -29,7 +29,7 @@ module Distribution.Client.JobControl (
 import Control.Monad
 import Control.Concurrent hiding (QSem, newQSem, waitQSem, signalQSem)
 import Control.Exception (SomeException, bracket_, throw, try)
-import Distribution.Client.Compat.Exception (mask)
+import Distribution.Compat.Exception (mask)
 import Distribution.Client.Compat.Semaphore
 
 data JobControl m a = JobControl {
diff --git a/cabal-install/Distribution/Client/Sandbox/PackageEnvironment.hs b/cabal-install/Distribution/Client/Sandbox/PackageEnvironment.hs
index d4d41cbcd95eb34eeec5ca4c1a05a00019d94a7f..db0a6145dac6cc984984f2b169393a9b1710660c 100644
--- a/cabal-install/Distribution/Client/Sandbox/PackageEnvironment.hs
+++ b/cabal-install/Distribution/Client/Sandbox/PackageEnvironment.hs
@@ -53,8 +53,7 @@ import Distribution.Verbosity          ( Verbosity, normal )
 import Control.Monad                   ( foldM, when, unless )
 import Data.List                       ( partition )
 import Data.Monoid                     ( Monoid(..) )
-import Distribution.Client.Compat.Exception
-                                       ( catchIO )
+import Distribution.Compat.Exception   ( catchIO )
 import System.Directory                ( doesDirectoryExist, doesFileExist,
                                          renameFile )
 import System.FilePath                 ( (<.>), (</>), takeDirectory )
diff --git a/cabal-install/Distribution/Client/Sandbox/Timestamp.hs b/cabal-install/Distribution/Client/Sandbox/Timestamp.hs
index a5b105d1741e46a9928b59a06bbfdf82f0cdc3b4..e6e4d30d609d9b3971c8d7c5a6d4c17a8bcc57f7 100644
--- a/cabal-install/Distribution/Client/Sandbox/Timestamp.hs
+++ b/cabal-install/Distribution/Client/Sandbox/Timestamp.hs
@@ -50,7 +50,7 @@ import Distribution.Client.SetupWrapper              (SetupScriptOptions (..),
 import Distribution.Client.Utils                     (inDir, removeExistingFile,
                                                       tryCanonicalizePath)
 
-import Distribution.Client.Compat.Exception          (catchIO)
+import Distribution.Compat.Exception                 (catchIO)
 import Distribution.Client.Compat.Time               (EpochTime, getCurTime,
                                                       getModTime)
 
diff --git a/cabal-install/Distribution/Client/SetupWrapper.hs b/cabal-install/Distribution/Client/SetupWrapper.hs
index 68d94451fac96f8dd0b31a68dd5ce3a4dc57beca..4e279b2adcd1f1d9aba02c4b7ee383078dca08e9 100644
--- a/cabal-install/Distribution/Client/SetupWrapper.hs
+++ b/cabal-install/Distribution/Client/SetupWrapper.hs
@@ -78,7 +78,7 @@ import Distribution.Text
          ( display )
 import Distribution.Verbosity
          ( Verbosity )
-import Distribution.Client.Compat.Exception
+import Distribution.Compat.Exception
          ( catchIO )
 
 import System.Directory  ( doesFileExist )
diff --git a/cabal-install/Distribution/Client/Utils.hs b/cabal-install/Distribution/Client/Utils.hs
index e1347622753865270d60a0f3d0ce076377d043e7..b025c1143f6d2bcc96d2d82097cb099c9f2dbc8c 100644
--- a/cabal-install/Distribution/Client/Utils.hs
+++ b/cabal-install/Distribution/Client/Utils.hs
@@ -9,7 +9,7 @@ module Distribution.Client.Utils ( MergeResult(..)
                                  , canonicalizePathNoThrow )
        where
 
-import Distribution.Client.Compat.Exception ( catchIO )
+import Distribution.Compat.Exception ( catchIO )
 import qualified Data.ByteString.Lazy as BS
 import Control.Monad
          ( when )
diff --git a/cabal-install/Distribution/Client/World.hs b/cabal-install/Distribution/Client/World.hs
index 8ef77827b968fcac41fbbe60a37729b4167ca9b5..f77828e8050427eccbc19a9dd129169ab0fbf4d9 100644
--- a/cabal-install/Distribution/Client/World.hs
+++ b/cabal-install/Distribution/Client/World.hs
@@ -40,7 +40,7 @@ import Distribution.Simple.Utils
 import Distribution.Text
          ( Text(..), display, simpleParse )
 import qualified Distribution.Compat.ReadP as Parse
-import Distribution.Client.Compat.Exception ( catchIO )
+import Distribution.Compat.Exception ( catchIO )
 import qualified Text.PrettyPrint as Disp
 import Text.PrettyPrint ( (<>), (<+>) )
 
diff --git a/cabal-install/cabal-install.cabal b/cabal-install/cabal-install.cabal
index a787e14b2d7a8de67958e10d670096222fd0c4d6..5a170f1182c1bbf8b881b3e1d895efdbe7c0cd78 100644
--- a/cabal-install/cabal-install.cabal
+++ b/cabal-install/cabal-install.cabal
@@ -105,7 +105,6 @@ executable cabal
         Distribution.Client.Utils
         Distribution.Client.World
         Distribution.Client.Win32SelfUpgrade
-        Distribution.Client.Compat.Exception
         Distribution.Client.Compat.Environment
         Distribution.Client.Compat.FilePerms
         Distribution.Client.Compat.Semaphore