diff --git a/base-compat.cabal b/base-compat.cabal
--- a/base-compat.cabal
+++ b/base-compat.cabal
@@ -1,5 +1,5 @@
 name:             base-compat
-version:          0.1.0.1
+version:          0.2.0
 license:          MIT
 license-file:     LICENSE
 copyright:        (c) 2012 Simon Hengel
@@ -22,23 +22,231 @@
                   * lookupEnv
                   .
                   * \<\>
+                  .
+                  * System.IO.Error.catch is not re-exported from Prelude for
+                    older versions of base
 
 source-repository head
   type: git
   location: https://github.com/sol/base-compat
 
 library
+  exposed: False
   ghc-options:
       -Wall
+  build-depends:
+      base == 4.*
+  extensions:
+      CPP
+    , PackageImports
+    , NoImplicitPrelude
+  ghc-options:
+    -fno-warn-duplicate-exports
+
+--  if impl(ghc == 7.6.1)
+--    include-dirs: includes/ghc-7.6.1/
+--  if impl(ghc == 7.4.2)
+--    include-dirs: includes/ghc-7.4.2/
+--  if impl(ghc == 7.4.1)
+--    include-dirs: includes/ghc-7.4.1/
+--  if impl(ghc == 7.2.2)
+--    include-dirs: includes/ghc-7.2.2/
+--  if impl(ghc == 7.2.1)
+--    include-dirs: includes/ghc-7.2.1/
+--  if impl(ghc == 7.0.4)
+--    include-dirs: includes/ghc-7.0.4/
+--  if impl(ghc == 7.0.3)
+--    include-dirs: includes/ghc-7.0.3/
+--  if impl(ghc == 7.0.2)
+--    include-dirs: includes/ghc-7.0.2/
+--  if impl(ghc == 7.0.1)
+--    include-dirs: includes/ghc-7.0.1/
+--  if impl(ghc == 6.12.3)
+--    include-dirs: includes/ghc-6.12.3/
+--  if impl(ghc == 6.12.2)
+--    include-dirs: includes/ghc-6.12.2/
+--  if impl(ghc == 6.12.1)
+--    include-dirs: includes/ghc-6.12.1/
+--
+--  install-includes:
+--    base-compat.h
+
   hs-source-dirs:
       src
   exposed-modules:
-      Data.Monoid.Compat
-      System.Environment.Compat
-      Text.Read.Compat
-  build-depends:
-      base == 4.*
+      -- with modifications
+      Data.Monoid
+      System.Environment
+      Text.Read
 
+      -- fixed warnings
+      GHC.ConsoleHandler
+      GHC.IO.Encoding.CodePage
+      Text.Show.Functions
+
+      -- stubbed for base < 4.5.0
+      GHC.Stack
+      GHC.Stats
+
+      -- stubbed for base < 4.4.0
+      Control.Monad.ST.Lazy.Safe
+      Control.Monad.ST.Lazy.Unsafe
+      Control.Monad.ST.Safe
+      Control.Monad.ST.Unsafe
+      Control.Monad.Zip
+      Data.Typeable.Internal
+      Foreign.ForeignPtr.Safe
+      Foreign.ForeignPtr.Unsafe
+      Foreign.Marshal.Safe
+      Foreign.Marshal.Unsafe
+      Foreign.Safe
+      GHC.Event
+      GHC.Fingerprint
+      GHC.Fingerprint.Type
+      GHC.Float.ConversionUtils
+      GHC.Float.RealFracMethods
+      GHC.Foreign
+      GHC.IO.Encoding.Failure
+
+      -- stubbed for base < 4.3.0
+      GHC.Conc.IO
+      GHC.Conc.Signal
+      GHC.Conc.Sync
+
+      -- pristine
+      Prelude
+      Control.Applicative
+      Control.Arrow
+      Control.Category
+      Control.Concurrent
+      Control.Concurrent.Chan
+      Control.Concurrent.MVar
+      Control.Exception
+      Control.Exception.Base
+      Control.Monad
+      Control.Monad.Fix
+      Control.Monad.Instances
+      Control.Monad.ST
+      Control.Monad.ST.Lazy
+      Control.Monad.ST.Strict
+      Data.Bits
+      Data.Bool
+      Data.Char
+      Data.Complex
+      Data.Data
+      Data.Dynamic
+      Data.Either
+      Data.Eq
+      Data.Fixed
+      Data.Foldable
+      Data.Function
+      Data.Functor
+      Data.Int
+      Data.IORef
+      Data.Ix
+      Data.List
+      Data.Maybe
+      Data.Ord
+      Data.Ratio
+      Data.STRef
+      Data.STRef.Lazy
+      Data.STRef.Strict
+      Data.String
+      Data.Traversable
+      Data.Tuple
+      Data.Typeable
+      Data.Unique
+      Data.Version
+      Data.Word
+      Debug.Trace
+      Foreign
+      Foreign.C
+      Foreign.C.Error
+      Foreign.Concurrent
+      Foreign.C.String
+      Foreign.C.Types
+      Foreign.ForeignPtr
+      Foreign.Marshal
+      Foreign.Marshal.Alloc
+      Foreign.Marshal.Array
+      Foreign.Marshal.Error
+      Foreign.Marshal.Pool
+      Foreign.Marshal.Utils
+      Foreign.Ptr
+      Foreign.StablePtr
+      Foreign.Storable
+      GHC.Arr
+      GHC.Base
+      GHC.Conc
+      GHC.Constants
+      GHC.Desugar
+      GHC.Enum
+      GHC.Environment
+      GHC.Err
+      GHC.Exception
+      GHC.Exts
+      GHC.Float
+      GHC.ForeignPtr
+      GHC.Int
+      GHC.IO
+      GHC.IOArray
+      GHC.IO.Buffer
+      GHC.IO.BufferedIO
+      GHC.IO.Device
+      GHC.IO.Encoding
+      GHC.IO.Encoding.Iconv
+      GHC.IO.Encoding.Latin1
+      GHC.IO.Encoding.Types
+      GHC.IO.Encoding.UTF16
+      GHC.IO.Encoding.UTF32
+      GHC.IO.Encoding.UTF8
+      GHC.IO.Exception
+      GHC.IO.FD
+      GHC.IO.Handle
+      GHC.IO.Handle.FD
+      GHC.IO.Handle.Internals
+      GHC.IO.Handle.Text
+      GHC.IO.Handle.Types
+      GHC.IO.IOMode
+      GHC.IORef
+      GHC.List
+      GHC.MVar
+      GHC.Num
+      GHC.Pack
+      GHC.PArr
+      GHC.Ptr
+      GHC.Read
+      GHC.Real
+      GHC.Show
+      GHC.ST
+      GHC.Stable
+      GHC.Storable
+      GHC.STRef
+      GHC.TopHandler
+      GHC.Unicode
+      GHC.Weak
+      GHC.Word
+      Numeric
+      System.Console.GetOpt
+      System.CPUTime
+      System.Exit
+      System.Info
+      System.IO
+      System.IO.Error
+      System.IO.Unsafe
+      System.Mem
+      System.Mem.StableName
+      System.Mem.Weak
+      System.Posix.Internals
+      System.Posix.Types
+      System.Timeout
+      Text.ParserCombinators.ReadP
+      Text.ParserCombinators.ReadPrec
+      Text.Printf
+      Text.Read.Lex
+      Text.Show
+      Unsafe.Coerce
+
 test-suite spec
   type:
       exitcode-stdio-1.0
@@ -49,7 +257,6 @@
   main-is:
       Spec.hs
   build-depends:
-      base
-    , base-compat
+      base-compat
     , hspec >= 1.3
     , setenv
diff --git a/src/Control/Applicative.hs b/src/Control/Applicative.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Applicative.hs
@@ -0,0 +1,4 @@
+module Control.Applicative (
+  module Base
+) where
+import "base" Control.Applicative as Base
diff --git a/src/Control/Arrow.hs b/src/Control/Arrow.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Arrow.hs
@@ -0,0 +1,4 @@
+module Control.Arrow (
+  module Base
+) where
+import "base" Control.Arrow as Base
diff --git a/src/Control/Category.hs b/src/Control/Category.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Category.hs
@@ -0,0 +1,4 @@
+module Control.Category (
+  module Base
+) where
+import "base" Control.Category as Base
diff --git a/src/Control/Concurrent.hs b/src/Control/Concurrent.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Concurrent.hs
@@ -0,0 +1,4 @@
+module Control.Concurrent (
+  module Base
+) where
+import "base" Control.Concurrent as Base
diff --git a/src/Control/Concurrent/Chan.hs b/src/Control/Concurrent/Chan.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Concurrent/Chan.hs
@@ -0,0 +1,4 @@
+module Control.Concurrent.Chan (
+  module Base
+) where
+import "base" Control.Concurrent.Chan as Base
diff --git a/src/Control/Concurrent/MVar.hs b/src/Control/Concurrent/MVar.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Concurrent/MVar.hs
@@ -0,0 +1,4 @@
+module Control.Concurrent.MVar (
+  module Base
+) where
+import "base" Control.Concurrent.MVar as Base
diff --git a/src/Control/Exception.hs b/src/Control/Exception.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Exception.hs
@@ -0,0 +1,5 @@
+module Control.Exception (
+  module Base
+) where
+import "base" Control.Exception as Base
+import GHC.Exception ()
diff --git a/src/Control/Exception/Base.hs b/src/Control/Exception/Base.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Exception/Base.hs
@@ -0,0 +1,5 @@
+module Control.Exception.Base (
+  module Base
+) where
+import "base" Control.Exception.Base as Base
+import GHC.Exception ()
diff --git a/src/Control/Monad.hs b/src/Control/Monad.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad.hs
@@ -0,0 +1,4 @@
+module Control.Monad (
+  module Base
+) where
+import "base" Control.Monad as Base
diff --git a/src/Control/Monad/Fix.hs b/src/Control/Monad/Fix.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/Fix.hs
@@ -0,0 +1,4 @@
+module Control.Monad.Fix (
+  module Base
+) where
+import "base" Control.Monad.Fix as Base
diff --git a/src/Control/Monad/Instances.hs b/src/Control/Monad/Instances.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/Instances.hs
@@ -0,0 +1,4 @@
+module Control.Monad.Instances (
+  module Base
+) where
+import "base" Control.Monad.Instances as Base
diff --git a/src/Control/Monad/ST.hs b/src/Control/Monad/ST.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/ST.hs
@@ -0,0 +1,4 @@
+module Control.Monad.ST (
+  module Base
+) where
+import "base" Control.Monad.ST as Base
diff --git a/src/Control/Monad/ST/Lazy.hs b/src/Control/Monad/ST/Lazy.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/ST/Lazy.hs
@@ -0,0 +1,4 @@
+module Control.Monad.ST.Lazy (
+  module Base
+) where
+import "base" Control.Monad.ST.Lazy as Base
diff --git a/src/Control/Monad/ST/Lazy/Safe.hs b/src/Control/Monad/ST/Lazy/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/ST/Lazy/Safe.hs
@@ -0,0 +1,8 @@
+module Control.Monad.ST.Lazy.Safe (
+#if MIN_VERSION_base(4,4,0)
+  module Base
+) where
+import "base" Control.Monad.ST.Lazy.Safe as Base
+#else
+) where
+#endif
diff --git a/src/Control/Monad/ST/Lazy/Unsafe.hs b/src/Control/Monad/ST/Lazy/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/ST/Lazy/Unsafe.hs
@@ -0,0 +1,8 @@
+module Control.Monad.ST.Lazy.Unsafe (
+#if MIN_VERSION_base(4,4,0)
+  module Base
+) where
+import "base" Control.Monad.ST.Lazy.Unsafe as Base
+#else
+) where
+#endif
diff --git a/src/Control/Monad/ST/Safe.hs b/src/Control/Monad/ST/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/ST/Safe.hs
@@ -0,0 +1,8 @@
+module Control.Monad.ST.Safe (
+#if MIN_VERSION_base(4,4,0)
+  module Base
+) where
+import "base" Control.Monad.ST.Safe as Base
+#else
+) where
+#endif
diff --git a/src/Control/Monad/ST/Strict.hs b/src/Control/Monad/ST/Strict.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/ST/Strict.hs
@@ -0,0 +1,4 @@
+module Control.Monad.ST.Strict (
+  module Base
+) where
+import "base" Control.Monad.ST.Strict as Base
diff --git a/src/Control/Monad/ST/Unsafe.hs b/src/Control/Monad/ST/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/ST/Unsafe.hs
@@ -0,0 +1,8 @@
+module Control.Monad.ST.Unsafe (
+#if MIN_VERSION_base(4,4,0)
+  module Base
+) where
+import "base" Control.Monad.ST.Unsafe as Base
+#else
+) where
+#endif
diff --git a/src/Control/Monad/Zip.hs b/src/Control/Monad/Zip.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/Zip.hs
@@ -0,0 +1,8 @@
+module Control.Monad.Zip (
+#if MIN_VERSION_base(4,4,0)
+  module Base
+) where
+import "base" Control.Monad.Zip as Base
+#else
+) where
+#endif
diff --git a/src/Data/Bits.hs b/src/Data/Bits.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Bits.hs
@@ -0,0 +1,4 @@
+module Data.Bits (
+  module Base
+) where
+import "base" Data.Bits as Base
diff --git a/src/Data/Bool.hs b/src/Data/Bool.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Bool.hs
@@ -0,0 +1,4 @@
+module Data.Bool (
+  module Base
+) where
+import "base" Data.Bool as Base
diff --git a/src/Data/Char.hs b/src/Data/Char.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Char.hs
@@ -0,0 +1,4 @@
+module Data.Char (
+  module Base
+) where
+import "base" Data.Char as Base
diff --git a/src/Data/Complex.hs b/src/Data/Complex.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Complex.hs
@@ -0,0 +1,4 @@
+module Data.Complex (
+  module Base
+) where
+import "base" Data.Complex as Base
diff --git a/src/Data/Data.hs b/src/Data/Data.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Data.hs
@@ -0,0 +1,4 @@
+module Data.Data (
+  module Base
+) where
+import "base" Data.Data as Base
diff --git a/src/Data/Dynamic.hs b/src/Data/Dynamic.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Dynamic.hs
@@ -0,0 +1,4 @@
+module Data.Dynamic (
+  module Base
+) where
+import "base" Data.Dynamic as Base
diff --git a/src/Data/Either.hs b/src/Data/Either.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Either.hs
@@ -0,0 +1,4 @@
+module Data.Either (
+  module Base
+) where
+import "base" Data.Either as Base
diff --git a/src/Data/Eq.hs b/src/Data/Eq.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Eq.hs
@@ -0,0 +1,4 @@
+module Data.Eq (
+  module Base
+) where
+import "base" Data.Eq as Base
diff --git a/src/Data/Fixed.hs b/src/Data/Fixed.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Fixed.hs
@@ -0,0 +1,4 @@
+module Data.Fixed (
+  module Base
+) where
+import "base" Data.Fixed as Base
diff --git a/src/Data/Foldable.hs b/src/Data/Foldable.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Foldable.hs
@@ -0,0 +1,4 @@
+module Data.Foldable (
+  module Base
+) where
+import "base" Data.Foldable as Base
diff --git a/src/Data/Function.hs b/src/Data/Function.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Function.hs
@@ -0,0 +1,4 @@
+module Data.Function (
+  module Base
+) where
+import "base" Data.Function as Base
diff --git a/src/Data/Functor.hs b/src/Data/Functor.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Functor.hs
@@ -0,0 +1,4 @@
+module Data.Functor (
+  module Base
+) where
+import "base" Data.Functor as Base
diff --git a/src/Data/IORef.hs b/src/Data/IORef.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/IORef.hs
@@ -0,0 +1,4 @@
+module Data.IORef (
+  module Base
+) where
+import "base" Data.IORef as Base
diff --git a/src/Data/Int.hs b/src/Data/Int.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Int.hs
@@ -0,0 +1,4 @@
+module Data.Int (
+  module Base
+) where
+import "base" Data.Int as Base
diff --git a/src/Data/Ix.hs b/src/Data/Ix.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Ix.hs
@@ -0,0 +1,4 @@
+module Data.Ix (
+  module Base
+) where
+import "base" Data.Ix as Base
diff --git a/src/Data/List.hs b/src/Data/List.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/List.hs
@@ -0,0 +1,4 @@
+module Data.List (
+  module Base
+) where
+import "base" Data.List as Base
diff --git a/src/Data/Maybe.hs b/src/Data/Maybe.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Maybe.hs
@@ -0,0 +1,4 @@
+module Data.Maybe (
+  module Base
+) where
+import "base" Data.Maybe as Base
diff --git a/src/Data/Monoid.hs b/src/Data/Monoid.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Monoid.hs
@@ -0,0 +1,12 @@
+module Data.Monoid (
+  module Base
+, (<>)
+) where
+import "base" Data.Monoid as Base
+
+#if !MIN_VERSION_base(4,5,0)
+-- | An infix synonym for 'mappend'.
+(<>) :: Monoid m => m -> m -> m
+(<>) = mappend
+{-# INLINE (<>) #-}
+#endif
diff --git a/src/Data/Monoid/Compat.hs b/src/Data/Monoid/Compat.hs
deleted file mode 100644
--- a/src/Data/Monoid/Compat.hs
+++ /dev/null
@@ -1,73 +0,0 @@
-{-# LANGUAGE CPP #-}
------------------------------------------------------------------------------
--- |
--- Module      :  Data.Monoid
--- Copyright   :  (c) Andy Gill 2001,
---                (c) Oregon Graduate Institute of Science and Technology, 2001
--- License     :  BSD-style (see the file libraries/base/LICENSE)
---
--- Maintainer  :  libraries@haskell.org
--- Stability   :  experimental
--- Portability :  portable
---
--- A class for monoids (types with an associative binary operation that
--- has an identity) with various general-purpose instances.
---
------------------------------------------------------------------------------
-module Data.Monoid.Compat (
-  -- * Monoid typeclass
-  Monoid(..),
-  (<>),
-  Dual(..),
-  Endo(..),
-  -- * Bool wrappers
-  All(..),
-  Any(..),
-  -- * Num wrappers
-  Sum(..),
-  Product(..),
-  -- * Maybe wrappers
-  -- $MaybeExamples
-  First(..),
-  Last(..)
-) where
-
-import Data.Monoid
-
-#if !MIN_VERSION_base(4,5,0)
--- | An infix synonym for 'mappend'.
-(<>) :: Monoid m => m -> m -> m
-(<>) = mappend
-{-# INLINE (<>) #-}
-#endif
-
--- $MaybeExamples
--- To implement @find@ or @findLast@ on any 'Foldable':
---
--- @
--- findLast :: Foldable t => (a -> Bool) -> t a -> Maybe a
--- findLast pred = getLast . foldMap (\x -> if pred x
---                                            then Last (Just x)
---                                            else Last Nothing)
--- @
---
--- Much of Data.Map's interface can be implemented with
--- Data.Map.alter. Some of the rest can be implemented with a new
--- @alterA@ function and either 'First' or 'Last':
---
--- > alterA :: (Applicative f, Ord k) =>
--- >           (Maybe a -> f (Maybe a)) -> k -> Map k a -> f (Map k a)
--- >
--- > instance Monoid a => Applicative ((,) a)  -- from Control.Applicative
---
--- @
--- insertLookupWithKey :: Ord k => (k -> v -> v -> v) -> k -> v
---                     -> Map k v -> (Maybe v, Map k v)
--- insertLookupWithKey combine key value =
---   Arrow.first getFirst . alterA doChange key
---   where
---   doChange Nothing = (First Nothing, Just value)
---   doChange (Just oldValue) =
---     (First (Just oldValue),
---      Just (combine key value oldValue))
--- @
diff --git a/src/Data/Ord.hs b/src/Data/Ord.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Ord.hs
@@ -0,0 +1,4 @@
+module Data.Ord (
+  module Base
+) where
+import "base" Data.Ord as Base
diff --git a/src/Data/Ratio.hs b/src/Data/Ratio.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Ratio.hs
@@ -0,0 +1,4 @@
+module Data.Ratio (
+  module Base
+) where
+import "base" Data.Ratio as Base
diff --git a/src/Data/STRef.hs b/src/Data/STRef.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/STRef.hs
@@ -0,0 +1,4 @@
+module Data.STRef (
+  module Base
+) where
+import "base" Data.STRef as Base
diff --git a/src/Data/STRef/Lazy.hs b/src/Data/STRef/Lazy.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/STRef/Lazy.hs
@@ -0,0 +1,4 @@
+module Data.STRef.Lazy (
+  module Base
+) where
+import "base" Data.STRef.Lazy as Base
diff --git a/src/Data/STRef/Strict.hs b/src/Data/STRef/Strict.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/STRef/Strict.hs
@@ -0,0 +1,4 @@
+module Data.STRef.Strict (
+  module Base
+) where
+import "base" Data.STRef.Strict as Base
diff --git a/src/Data/String.hs b/src/Data/String.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/String.hs
@@ -0,0 +1,4 @@
+module Data.String (
+  module Base
+) where
+import "base" Data.String as Base
diff --git a/src/Data/Traversable.hs b/src/Data/Traversable.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Traversable.hs
@@ -0,0 +1,4 @@
+module Data.Traversable (
+  module Base
+) where
+import "base" Data.Traversable as Base
diff --git a/src/Data/Tuple.hs b/src/Data/Tuple.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Tuple.hs
@@ -0,0 +1,4 @@
+module Data.Tuple (
+  module Base
+) where
+import "base" Data.Tuple as Base
diff --git a/src/Data/Typeable.hs b/src/Data/Typeable.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Typeable.hs
@@ -0,0 +1,4 @@
+module Data.Typeable (
+  module Base
+) where
+import "base" Data.Typeable as Base
diff --git a/src/Data/Typeable/Internal.hs b/src/Data/Typeable/Internal.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Typeable/Internal.hs
@@ -0,0 +1,8 @@
+module Data.Typeable.Internal (
+#if MIN_VERSION_base(4,4,0)
+  module Base
+) where
+import "base" Data.Typeable.Internal as Base
+#else
+) where
+#endif
diff --git a/src/Data/Unique.hs b/src/Data/Unique.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Unique.hs
@@ -0,0 +1,4 @@
+module Data.Unique (
+  module Base
+) where
+import "base" Data.Unique as Base
diff --git a/src/Data/Version.hs b/src/Data/Version.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Version.hs
@@ -0,0 +1,4 @@
+module Data.Version (
+  module Base
+) where
+import "base" Data.Version as Base
diff --git a/src/Data/Word.hs b/src/Data/Word.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Word.hs
@@ -0,0 +1,4 @@
+module Data.Word (
+  module Base
+) where
+import "base" Data.Word as Base
diff --git a/src/Debug/Trace.hs b/src/Debug/Trace.hs
new file mode 100644
--- /dev/null
+++ b/src/Debug/Trace.hs
@@ -0,0 +1,4 @@
+module Debug.Trace (
+  module Base
+) where
+import "base" Debug.Trace as Base
diff --git a/src/Foreign.hs b/src/Foreign.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign.hs
@@ -0,0 +1,4 @@
+module Foreign (
+  module Base
+) where
+import "base" Foreign as Base
diff --git a/src/Foreign/C.hs b/src/Foreign/C.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/C.hs
@@ -0,0 +1,4 @@
+module Foreign.C (
+  module Base
+) where
+import "base" Foreign.C as Base
diff --git a/src/Foreign/C/Error.hs b/src/Foreign/C/Error.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/C/Error.hs
@@ -0,0 +1,4 @@
+module Foreign.C.Error (
+  module Base
+) where
+import "base" Foreign.C.Error as Base
diff --git a/src/Foreign/C/String.hs b/src/Foreign/C/String.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/C/String.hs
@@ -0,0 +1,4 @@
+module Foreign.C.String (
+  module Base
+) where
+import "base" Foreign.C.String as Base
diff --git a/src/Foreign/C/Types.hs b/src/Foreign/C/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/C/Types.hs
@@ -0,0 +1,4 @@
+module Foreign.C.Types (
+  module Base
+) where
+import "base" Foreign.C.Types as Base
diff --git a/src/Foreign/Concurrent.hs b/src/Foreign/Concurrent.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Concurrent.hs
@@ -0,0 +1,4 @@
+module Foreign.Concurrent (
+  module Base
+) where
+import "base" Foreign.Concurrent as Base
diff --git a/src/Foreign/ForeignPtr.hs b/src/Foreign/ForeignPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/ForeignPtr.hs
@@ -0,0 +1,4 @@
+module Foreign.ForeignPtr (
+  module Base
+) where
+import "base" Foreign.ForeignPtr as Base
diff --git a/src/Foreign/ForeignPtr/Safe.hs b/src/Foreign/ForeignPtr/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/ForeignPtr/Safe.hs
@@ -0,0 +1,8 @@
+module Foreign.ForeignPtr.Safe (
+#if MIN_VERSION_base(4,4,0)
+  module Base
+) where
+import "base" Foreign.ForeignPtr.Safe as Base
+#else
+) where
+#endif
diff --git a/src/Foreign/ForeignPtr/Unsafe.hs b/src/Foreign/ForeignPtr/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/ForeignPtr/Unsafe.hs
@@ -0,0 +1,8 @@
+module Foreign.ForeignPtr.Unsafe (
+#if MIN_VERSION_base(4,4,0)
+  module Base
+) where
+import "base" Foreign.ForeignPtr.Unsafe as Base
+#else
+) where
+#endif
diff --git a/src/Foreign/Marshal.hs b/src/Foreign/Marshal.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Marshal.hs
@@ -0,0 +1,4 @@
+module Foreign.Marshal (
+  module Base
+) where
+import "base" Foreign.Marshal as Base
diff --git a/src/Foreign/Marshal/Alloc.hs b/src/Foreign/Marshal/Alloc.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Marshal/Alloc.hs
@@ -0,0 +1,4 @@
+module Foreign.Marshal.Alloc (
+  module Base
+) where
+import "base" Foreign.Marshal.Alloc as Base
diff --git a/src/Foreign/Marshal/Array.hs b/src/Foreign/Marshal/Array.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Marshal/Array.hs
@@ -0,0 +1,4 @@
+module Foreign.Marshal.Array (
+  module Base
+) where
+import "base" Foreign.Marshal.Array as Base
diff --git a/src/Foreign/Marshal/Error.hs b/src/Foreign/Marshal/Error.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Marshal/Error.hs
@@ -0,0 +1,4 @@
+module Foreign.Marshal.Error (
+  module Base
+) where
+import "base" Foreign.Marshal.Error as Base
diff --git a/src/Foreign/Marshal/Pool.hs b/src/Foreign/Marshal/Pool.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Marshal/Pool.hs
@@ -0,0 +1,4 @@
+module Foreign.Marshal.Pool (
+  module Base
+) where
+import "base" Foreign.Marshal.Pool as Base
diff --git a/src/Foreign/Marshal/Safe.hs b/src/Foreign/Marshal/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Marshal/Safe.hs
@@ -0,0 +1,8 @@
+module Foreign.Marshal.Safe (
+#if MIN_VERSION_base(4,4,0)
+  module Base
+) where
+import "base" Foreign.Marshal.Safe as Base
+#else
+) where
+#endif
diff --git a/src/Foreign/Marshal/Unsafe.hs b/src/Foreign/Marshal/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Marshal/Unsafe.hs
@@ -0,0 +1,8 @@
+module Foreign.Marshal.Unsafe (
+#if MIN_VERSION_base(4,4,0)
+  module Base
+) where
+import "base" Foreign.Marshal.Unsafe as Base
+#else
+) where
+#endif
diff --git a/src/Foreign/Marshal/Utils.hs b/src/Foreign/Marshal/Utils.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Marshal/Utils.hs
@@ -0,0 +1,4 @@
+module Foreign.Marshal.Utils (
+  module Base
+) where
+import "base" Foreign.Marshal.Utils as Base
diff --git a/src/Foreign/Ptr.hs b/src/Foreign/Ptr.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Ptr.hs
@@ -0,0 +1,4 @@
+module Foreign.Ptr (
+  module Base
+) where
+import "base" Foreign.Ptr as Base
diff --git a/src/Foreign/Safe.hs b/src/Foreign/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Safe.hs
@@ -0,0 +1,8 @@
+module Foreign.Safe (
+#if MIN_VERSION_base(4,4,0)
+  module Base
+) where
+import "base" Foreign.Safe as Base
+#else
+) where
+#endif
diff --git a/src/Foreign/StablePtr.hs b/src/Foreign/StablePtr.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/StablePtr.hs
@@ -0,0 +1,4 @@
+module Foreign.StablePtr (
+  module Base
+) where
+import "base" Foreign.StablePtr as Base
diff --git a/src/Foreign/Storable.hs b/src/Foreign/Storable.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Storable.hs
@@ -0,0 +1,4 @@
+module Foreign.Storable (
+  module Base
+) where
+import "base" Foreign.Storable as Base
diff --git a/src/GHC/Arr.hs b/src/GHC/Arr.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Arr.hs
@@ -0,0 +1,4 @@
+module GHC.Arr (
+  module Base
+) where
+import "base" GHC.Arr as Base
diff --git a/src/GHC/Base.hs b/src/GHC/Base.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Base.hs
@@ -0,0 +1,4 @@
+module GHC.Base (
+  module Base
+) where
+import "base" GHC.Base as Base
diff --git a/src/GHC/Conc.hs b/src/GHC/Conc.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Conc.hs
@@ -0,0 +1,4 @@
+module GHC.Conc (
+  module Base
+) where
+import "base" GHC.Conc as Base
diff --git a/src/GHC/Conc/IO.hs b/src/GHC/Conc/IO.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Conc/IO.hs
@@ -0,0 +1,8 @@
+module GHC.Conc.IO (
+#if MIN_VERSION_base(4,3,0)
+  module Base
+) where
+import "base" GHC.Conc.IO as Base
+#else
+) where
+#endif
diff --git a/src/GHC/Conc/Signal.hs b/src/GHC/Conc/Signal.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Conc/Signal.hs
@@ -0,0 +1,8 @@
+module GHC.Conc.Signal (
+#if MIN_VERSION_base(4,3,0)
+  module Base
+) where
+import "base" GHC.Conc.Signal as Base
+#else
+) where
+#endif
diff --git a/src/GHC/Conc/Sync.hs b/src/GHC/Conc/Sync.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Conc/Sync.hs
@@ -0,0 +1,8 @@
+module GHC.Conc.Sync (
+#if MIN_VERSION_base(4,3,0)
+  module Base
+) where
+import "base" GHC.Conc.Sync as Base
+#else
+) where
+#endif
diff --git a/src/GHC/ConsoleHandler.hs b/src/GHC/ConsoleHandler.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/ConsoleHandler.hs
@@ -0,0 +1,4 @@
+{-# OPTIONS_GHC -fno-warn-dodgy-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+module GHC.ConsoleHandler (module Base) where
+import "base" GHC.ConsoleHandler as Base
diff --git a/src/GHC/Constants.hs b/src/GHC/Constants.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Constants.hs
@@ -0,0 +1,4 @@
+module GHC.Constants (
+  module Base
+) where
+import "base" GHC.Constants as Base
diff --git a/src/GHC/Desugar.hs b/src/GHC/Desugar.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Desugar.hs
@@ -0,0 +1,4 @@
+module GHC.Desugar (
+  module Base
+) where
+import "base" GHC.Desugar as Base
diff --git a/src/GHC/Enum.hs b/src/GHC/Enum.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Enum.hs
@@ -0,0 +1,4 @@
+module GHC.Enum (
+  module Base
+) where
+import "base" GHC.Enum as Base
diff --git a/src/GHC/Environment.hs b/src/GHC/Environment.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Environment.hs
@@ -0,0 +1,4 @@
+module GHC.Environment (
+  module Base
+) where
+import "base" GHC.Environment as Base
diff --git a/src/GHC/Err.hs b/src/GHC/Err.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Err.hs
@@ -0,0 +1,4 @@
+module GHC.Err (
+  module Base
+) where
+import "base" GHC.Err as Base
diff --git a/src/GHC/Event.hs b/src/GHC/Event.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Event.hs
@@ -0,0 +1,8 @@
+module GHC.Event (
+#if MIN_VERSION_base(4,4,0)
+  module Base
+) where
+import "base" GHC.Event as Base
+#else
+) where
+#endif
diff --git a/src/GHC/Exception.hs b/src/GHC/Exception.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Exception.hs
@@ -0,0 +1,12 @@
+{-# LANGUAGE StandaloneDeriving #-}
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+module GHC.Exception (
+  module Base
+) where
+import "base" GHC.Exception as Base
+
+#if __GLASGOW_HASKELL__ <= 706
+import Prelude
+deriving instance Eq ErrorCall
+deriving instance Ord ErrorCall
+#endif
diff --git a/src/GHC/Exts.hs b/src/GHC/Exts.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Exts.hs
@@ -0,0 +1,4 @@
+module GHC.Exts (
+  module Base
+) where
+import "base" GHC.Exts as Base
diff --git a/src/GHC/Fingerprint.hs b/src/GHC/Fingerprint.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Fingerprint.hs
@@ -0,0 +1,8 @@
+module GHC.Fingerprint (
+#if MIN_VERSION_base(4,4,0)
+  module Base
+) where
+import "base" GHC.Fingerprint as Base
+#else
+) where
+#endif
diff --git a/src/GHC/Fingerprint/Type.hs b/src/GHC/Fingerprint/Type.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Fingerprint/Type.hs
@@ -0,0 +1,8 @@
+module GHC.Fingerprint.Type (
+#if MIN_VERSION_base(4,4,0)
+  module Base
+) where
+import "base" GHC.Fingerprint.Type as Base
+#else
+) where
+#endif
diff --git a/src/GHC/Float.hs b/src/GHC/Float.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Float.hs
@@ -0,0 +1,4 @@
+module GHC.Float (
+  module Base
+) where
+import "base" GHC.Float as Base
diff --git a/src/GHC/Float/ConversionUtils.hs b/src/GHC/Float/ConversionUtils.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Float/ConversionUtils.hs
@@ -0,0 +1,8 @@
+module GHC.Float.ConversionUtils (
+#if MIN_VERSION_base(4,4,0)
+  module Base
+) where
+import "base" GHC.Float.ConversionUtils as Base
+#else
+) where
+#endif
diff --git a/src/GHC/Float/RealFracMethods.hs b/src/GHC/Float/RealFracMethods.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Float/RealFracMethods.hs
@@ -0,0 +1,8 @@
+module GHC.Float.RealFracMethods (
+#if MIN_VERSION_base(4,4,0)
+  module Base
+) where
+import "base" GHC.Float.RealFracMethods as Base
+#else
+) where
+#endif
diff --git a/src/GHC/Foreign.hs b/src/GHC/Foreign.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Foreign.hs
@@ -0,0 +1,8 @@
+module GHC.Foreign (
+#if MIN_VERSION_base(4,4,0)
+  module Base
+) where
+import "base" GHC.Foreign as Base
+#else
+) where
+#endif
diff --git a/src/GHC/ForeignPtr.hs b/src/GHC/ForeignPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/ForeignPtr.hs
@@ -0,0 +1,4 @@
+module GHC.ForeignPtr (
+  module Base
+) where
+import "base" GHC.ForeignPtr as Base
diff --git a/src/GHC/IO.hs b/src/GHC/IO.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/IO.hs
@@ -0,0 +1,4 @@
+module GHC.IO (
+  module Base
+) where
+import "base" GHC.IO as Base
diff --git a/src/GHC/IO/Buffer.hs b/src/GHC/IO/Buffer.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/IO/Buffer.hs
@@ -0,0 +1,4 @@
+module GHC.IO.Buffer (
+  module Base
+) where
+import "base" GHC.IO.Buffer as Base
diff --git a/src/GHC/IO/BufferedIO.hs b/src/GHC/IO/BufferedIO.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/IO/BufferedIO.hs
@@ -0,0 +1,4 @@
+module GHC.IO.BufferedIO (
+  module Base
+) where
+import "base" GHC.IO.BufferedIO as Base
diff --git a/src/GHC/IO/Device.hs b/src/GHC/IO/Device.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/IO/Device.hs
@@ -0,0 +1,4 @@
+module GHC.IO.Device (
+  module Base
+) where
+import "base" GHC.IO.Device as Base
diff --git a/src/GHC/IO/Encoding.hs b/src/GHC/IO/Encoding.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/IO/Encoding.hs
@@ -0,0 +1,4 @@
+module GHC.IO.Encoding (
+  module Base
+) where
+import "base" GHC.IO.Encoding as Base
diff --git a/src/GHC/IO/Encoding/CodePage.hs b/src/GHC/IO/Encoding/CodePage.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/IO/Encoding/CodePage.hs
@@ -0,0 +1,4 @@
+{-# OPTIONS_GHC -fno-warn-dodgy-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+module GHC.IO.Encoding.CodePage (module Base) where
+import "base" GHC.IO.Encoding.CodePage as Base
diff --git a/src/GHC/IO/Encoding/Failure.hs b/src/GHC/IO/Encoding/Failure.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/IO/Encoding/Failure.hs
@@ -0,0 +1,8 @@
+module GHC.IO.Encoding.Failure (
+#if MIN_VERSION_base(4,4,0)
+  module Base
+) where
+import "base" GHC.IO.Encoding.Failure as Base
+#else
+) where
+#endif
diff --git a/src/GHC/IO/Encoding/Iconv.hs b/src/GHC/IO/Encoding/Iconv.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/IO/Encoding/Iconv.hs
@@ -0,0 +1,4 @@
+module GHC.IO.Encoding.Iconv (
+  module Base
+) where
+import "base" GHC.IO.Encoding.Iconv as Base
diff --git a/src/GHC/IO/Encoding/Latin1.hs b/src/GHC/IO/Encoding/Latin1.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/IO/Encoding/Latin1.hs
@@ -0,0 +1,4 @@
+module GHC.IO.Encoding.Latin1 (
+  module Base
+) where
+import "base" GHC.IO.Encoding.Latin1 as Base
diff --git a/src/GHC/IO/Encoding/Types.hs b/src/GHC/IO/Encoding/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/IO/Encoding/Types.hs
@@ -0,0 +1,4 @@
+module GHC.IO.Encoding.Types (
+  module Base
+) where
+import "base" GHC.IO.Encoding.Types as Base
diff --git a/src/GHC/IO/Encoding/UTF16.hs b/src/GHC/IO/Encoding/UTF16.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/IO/Encoding/UTF16.hs
@@ -0,0 +1,4 @@
+module GHC.IO.Encoding.UTF16 (
+  module Base
+) where
+import "base" GHC.IO.Encoding.UTF16 as Base
diff --git a/src/GHC/IO/Encoding/UTF32.hs b/src/GHC/IO/Encoding/UTF32.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/IO/Encoding/UTF32.hs
@@ -0,0 +1,4 @@
+module GHC.IO.Encoding.UTF32 (
+  module Base
+) where
+import "base" GHC.IO.Encoding.UTF32 as Base
diff --git a/src/GHC/IO/Encoding/UTF8.hs b/src/GHC/IO/Encoding/UTF8.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/IO/Encoding/UTF8.hs
@@ -0,0 +1,4 @@
+module GHC.IO.Encoding.UTF8 (
+  module Base
+) where
+import "base" GHC.IO.Encoding.UTF8 as Base
diff --git a/src/GHC/IO/Exception.hs b/src/GHC/IO/Exception.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/IO/Exception.hs
@@ -0,0 +1,4 @@
+module GHC.IO.Exception (
+  module Base
+) where
+import "base" GHC.IO.Exception as Base
diff --git a/src/GHC/IO/FD.hs b/src/GHC/IO/FD.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/IO/FD.hs
@@ -0,0 +1,4 @@
+module GHC.IO.FD (
+  module Base
+) where
+import "base" GHC.IO.FD as Base
diff --git a/src/GHC/IO/Handle.hs b/src/GHC/IO/Handle.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/IO/Handle.hs
@@ -0,0 +1,4 @@
+module GHC.IO.Handle (
+  module Base
+) where
+import "base" GHC.IO.Handle as Base
diff --git a/src/GHC/IO/Handle/FD.hs b/src/GHC/IO/Handle/FD.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/IO/Handle/FD.hs
@@ -0,0 +1,4 @@
+module GHC.IO.Handle.FD (
+  module Base
+) where
+import "base" GHC.IO.Handle.FD as Base
diff --git a/src/GHC/IO/Handle/Internals.hs b/src/GHC/IO/Handle/Internals.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/IO/Handle/Internals.hs
@@ -0,0 +1,4 @@
+module GHC.IO.Handle.Internals (
+  module Base
+) where
+import "base" GHC.IO.Handle.Internals as Base
diff --git a/src/GHC/IO/Handle/Text.hs b/src/GHC/IO/Handle/Text.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/IO/Handle/Text.hs
@@ -0,0 +1,4 @@
+module GHC.IO.Handle.Text (
+  module Base
+) where
+import "base" GHC.IO.Handle.Text as Base
diff --git a/src/GHC/IO/Handle/Types.hs b/src/GHC/IO/Handle/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/IO/Handle/Types.hs
@@ -0,0 +1,4 @@
+module GHC.IO.Handle.Types (
+  module Base
+) where
+import "base" GHC.IO.Handle.Types as Base
diff --git a/src/GHC/IO/IOMode.hs b/src/GHC/IO/IOMode.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/IO/IOMode.hs
@@ -0,0 +1,4 @@
+module GHC.IO.IOMode (
+  module Base
+) where
+import "base" GHC.IO.IOMode as Base
diff --git a/src/GHC/IOArray.hs b/src/GHC/IOArray.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/IOArray.hs
@@ -0,0 +1,4 @@
+module GHC.IOArray (
+  module Base
+) where
+import "base" GHC.IOArray as Base
diff --git a/src/GHC/IORef.hs b/src/GHC/IORef.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/IORef.hs
@@ -0,0 +1,4 @@
+module GHC.IORef (
+  module Base
+) where
+import "base" GHC.IORef as Base
diff --git a/src/GHC/Int.hs b/src/GHC/Int.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Int.hs
@@ -0,0 +1,4 @@
+module GHC.Int (
+  module Base
+) where
+import "base" GHC.Int as Base
diff --git a/src/GHC/List.hs b/src/GHC/List.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/List.hs
@@ -0,0 +1,4 @@
+module GHC.List (
+  module Base
+) where
+import "base" GHC.List as Base
diff --git a/src/GHC/MVar.hs b/src/GHC/MVar.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/MVar.hs
@@ -0,0 +1,4 @@
+module GHC.MVar (
+  module Base
+) where
+import "base" GHC.MVar as Base
diff --git a/src/GHC/Num.hs b/src/GHC/Num.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Num.hs
@@ -0,0 +1,4 @@
+module GHC.Num (
+  module Base
+) where
+import "base" GHC.Num as Base
diff --git a/src/GHC/PArr.hs b/src/GHC/PArr.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/PArr.hs
@@ -0,0 +1,4 @@
+module GHC.PArr (
+  module Base
+) where
+import "base" GHC.PArr as Base
diff --git a/src/GHC/Pack.hs b/src/GHC/Pack.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Pack.hs
@@ -0,0 +1,4 @@
+module GHC.Pack (
+  module Base
+) where
+import "base" GHC.Pack as Base
diff --git a/src/GHC/Ptr.hs b/src/GHC/Ptr.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Ptr.hs
@@ -0,0 +1,4 @@
+module GHC.Ptr (
+  module Base
+) where
+import "base" GHC.Ptr as Base
diff --git a/src/GHC/Read.hs b/src/GHC/Read.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Read.hs
@@ -0,0 +1,4 @@
+module GHC.Read (
+  module Base
+) where
+import "base" GHC.Read as Base
diff --git a/src/GHC/Real.hs b/src/GHC/Real.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Real.hs
@@ -0,0 +1,4 @@
+module GHC.Real (
+  module Base
+) where
+import "base" GHC.Real as Base
diff --git a/src/GHC/ST.hs b/src/GHC/ST.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/ST.hs
@@ -0,0 +1,4 @@
+module GHC.ST (
+  module Base
+) where
+import "base" GHC.ST as Base
diff --git a/src/GHC/STRef.hs b/src/GHC/STRef.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/STRef.hs
@@ -0,0 +1,4 @@
+module GHC.STRef (
+  module Base
+) where
+import "base" GHC.STRef as Base
diff --git a/src/GHC/Show.hs b/src/GHC/Show.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Show.hs
@@ -0,0 +1,4 @@
+module GHC.Show (
+  module Base
+) where
+import "base" GHC.Show as Base
diff --git a/src/GHC/Stable.hs b/src/GHC/Stable.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Stable.hs
@@ -0,0 +1,4 @@
+module GHC.Stable (
+  module Base
+) where
+import "base" GHC.Stable as Base
diff --git a/src/GHC/Stack.hs b/src/GHC/Stack.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Stack.hs
@@ -0,0 +1,8 @@
+module GHC.Stack (
+#if MIN_VERSION_base(4,5,0)
+  module Base
+) where
+import "base" GHC.Stack as Base
+#else
+) where
+#endif
diff --git a/src/GHC/Stats.hs b/src/GHC/Stats.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Stats.hs
@@ -0,0 +1,8 @@
+module GHC.Stats (
+#if MIN_VERSION_base(4,5,0)
+  module Base
+) where
+import "base" GHC.Stats as Base
+#else
+) where
+#endif
diff --git a/src/GHC/Storable.hs b/src/GHC/Storable.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Storable.hs
@@ -0,0 +1,4 @@
+module GHC.Storable (
+  module Base
+) where
+import "base" GHC.Storable as Base
diff --git a/src/GHC/TopHandler.hs b/src/GHC/TopHandler.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/TopHandler.hs
@@ -0,0 +1,4 @@
+module GHC.TopHandler (
+  module Base
+) where
+import "base" GHC.TopHandler as Base
diff --git a/src/GHC/Unicode.hs b/src/GHC/Unicode.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Unicode.hs
@@ -0,0 +1,4 @@
+module GHC.Unicode (
+  module Base
+) where
+import "base" GHC.Unicode as Base
diff --git a/src/GHC/Weak.hs b/src/GHC/Weak.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Weak.hs
@@ -0,0 +1,4 @@
+module GHC.Weak (
+  module Base
+) where
+import "base" GHC.Weak as Base
diff --git a/src/GHC/Word.hs b/src/GHC/Word.hs
new file mode 100644
--- /dev/null
+++ b/src/GHC/Word.hs
@@ -0,0 +1,4 @@
+module GHC.Word (
+  module Base
+) where
+import "base" GHC.Word as Base
diff --git a/src/Numeric.hs b/src/Numeric.hs
new file mode 100644
--- /dev/null
+++ b/src/Numeric.hs
@@ -0,0 +1,4 @@
+module Numeric (
+  module Base
+) where
+import "base" Numeric as Base
diff --git a/src/Prelude.hs b/src/Prelude.hs
new file mode 100644
--- /dev/null
+++ b/src/Prelude.hs
@@ -0,0 +1,8 @@
+module Prelude (
+  module Base
+) where
+#if MIN_VERSION_base(4,6,0)
+import "base" Prelude as Base
+#else
+import "base" Prelude as Base hiding (catch)
+#endif
diff --git a/src/System/CPUTime.hs b/src/System/CPUTime.hs
new file mode 100644
--- /dev/null
+++ b/src/System/CPUTime.hs
@@ -0,0 +1,4 @@
+module System.CPUTime (
+  module Base
+) where
+import "base" System.CPUTime as Base
diff --git a/src/System/Console/GetOpt.hs b/src/System/Console/GetOpt.hs
new file mode 100644
--- /dev/null
+++ b/src/System/Console/GetOpt.hs
@@ -0,0 +1,4 @@
+module System.Console.GetOpt (
+  module Base
+) where
+import "base" System.Console.GetOpt as Base
diff --git a/src/System/Environment.hs b/src/System/Environment.hs
new file mode 100644
--- /dev/null
+++ b/src/System/Environment.hs
@@ -0,0 +1,16 @@
+module System.Environment (
+  module Base
+, lookupEnv
+) where
+
+import "base" System.Environment as Base
+
+#if !MIN_VERSION_base(4,6,0)
+import Prelude
+-- | Return the value of the environment variable @var@, or @Nothing@ if
+-- there is no such value.
+--
+-- For POSIX users, this is equivalent to 'System.Posix.Env.getEnv'.
+lookupEnv :: String -> IO (Maybe String)
+lookupEnv k = lookup k `fmap` getEnvironment
+#endif
diff --git a/src/System/Environment/Compat.hs b/src/System/Environment/Compat.hs
deleted file mode 100644
--- a/src/System/Environment/Compat.hs
+++ /dev/null
@@ -1,22 +0,0 @@
-{-# LANGUAGE CPP #-}
--- | Miscellaneous information about the system environment.
-module System.Environment.Compat (
-  getArgs
-, getProgName
-, getEnv
-, lookupEnv
-, withArgs
-, withProgName
-, getEnvironment
-) where
-
-import           System.Environment
-
-#if !MIN_VERSION_base(4,6,0)
--- | Return the value of the environment variable @var@, or @Nothing@ if
--- there is no such value.
---
--- For POSIX users, this is equivalent to 'System.Posix.Env.getEnv'.
-lookupEnv :: String -> IO (Maybe String)
-lookupEnv k = lookup k `fmap` getEnvironment
-#endif
diff --git a/src/System/Exit.hs b/src/System/Exit.hs
new file mode 100644
--- /dev/null
+++ b/src/System/Exit.hs
@@ -0,0 +1,4 @@
+module System.Exit (
+  module Base
+) where
+import "base" System.Exit as Base
diff --git a/src/System/IO.hs b/src/System/IO.hs
new file mode 100644
--- /dev/null
+++ b/src/System/IO.hs
@@ -0,0 +1,4 @@
+module System.IO (
+  module Base
+) where
+import "base" System.IO as Base
diff --git a/src/System/IO/Error.hs b/src/System/IO/Error.hs
new file mode 100644
--- /dev/null
+++ b/src/System/IO/Error.hs
@@ -0,0 +1,4 @@
+module System.IO.Error (
+  module Base
+) where
+import "base" System.IO.Error as Base
diff --git a/src/System/IO/Unsafe.hs b/src/System/IO/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/System/IO/Unsafe.hs
@@ -0,0 +1,4 @@
+module System.IO.Unsafe (
+  module Base
+) where
+import "base" System.IO.Unsafe as Base
diff --git a/src/System/Info.hs b/src/System/Info.hs
new file mode 100644
--- /dev/null
+++ b/src/System/Info.hs
@@ -0,0 +1,4 @@
+module System.Info (
+  module Base
+) where
+import "base" System.Info as Base
diff --git a/src/System/Mem.hs b/src/System/Mem.hs
new file mode 100644
--- /dev/null
+++ b/src/System/Mem.hs
@@ -0,0 +1,4 @@
+module System.Mem (
+  module Base
+) where
+import "base" System.Mem as Base
diff --git a/src/System/Mem/StableName.hs b/src/System/Mem/StableName.hs
new file mode 100644
--- /dev/null
+++ b/src/System/Mem/StableName.hs
@@ -0,0 +1,4 @@
+module System.Mem.StableName (
+  module Base
+) where
+import "base" System.Mem.StableName as Base
diff --git a/src/System/Mem/Weak.hs b/src/System/Mem/Weak.hs
new file mode 100644
--- /dev/null
+++ b/src/System/Mem/Weak.hs
@@ -0,0 +1,4 @@
+module System.Mem.Weak (
+  module Base
+) where
+import "base" System.Mem.Weak as Base
diff --git a/src/System/Posix/Internals.hs b/src/System/Posix/Internals.hs
new file mode 100644
--- /dev/null
+++ b/src/System/Posix/Internals.hs
@@ -0,0 +1,4 @@
+module System.Posix.Internals (
+  module Base
+) where
+import "base" System.Posix.Internals as Base
diff --git a/src/System/Posix/Types.hs b/src/System/Posix/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/System/Posix/Types.hs
@@ -0,0 +1,4 @@
+module System.Posix.Types (
+  module Base
+) where
+import "base" System.Posix.Types as Base
diff --git a/src/System/Timeout.hs b/src/System/Timeout.hs
new file mode 100644
--- /dev/null
+++ b/src/System/Timeout.hs
@@ -0,0 +1,4 @@
+module System.Timeout (
+  module Base
+) where
+import "base" System.Timeout as Base
diff --git a/src/Text/ParserCombinators/ReadP.hs b/src/Text/ParserCombinators/ReadP.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/ParserCombinators/ReadP.hs
@@ -0,0 +1,4 @@
+module Text.ParserCombinators.ReadP (
+  module Base
+) where
+import "base" Text.ParserCombinators.ReadP as Base
diff --git a/src/Text/ParserCombinators/ReadPrec.hs b/src/Text/ParserCombinators/ReadPrec.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/ParserCombinators/ReadPrec.hs
@@ -0,0 +1,4 @@
+module Text.ParserCombinators.ReadPrec (
+  module Base
+) where
+import "base" Text.ParserCombinators.ReadPrec as Base
diff --git a/src/Text/Printf.hs b/src/Text/Printf.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Printf.hs
@@ -0,0 +1,4 @@
+module Text.Printf (
+  module Base
+) where
+import "base" Text.Printf as Base
diff --git a/src/Text/Read.hs b/src/Text/Read.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Read.hs
@@ -0,0 +1,33 @@
+module Text.Read (
+  module Base
+, readEither
+, readMaybe
+) where
+import "base" Text.Read as Base
+
+#if !MIN_VERSION_base(4,6,0)
+import qualified Text.ParserCombinators.ReadP as P
+import Prelude
+
+-- | Parse a string using the 'Read' instance.
+-- Succeeds if there is exactly one valid result.
+-- A 'Left' value indicates a parse error.
+readEither :: Read a => String -> Either String a
+readEither s =
+  case [ x | (x,"") <- readPrec_to_S read' minPrec s ] of
+    [x] -> Right x
+    []  -> Left "Prelude.read: no parse"
+    _   -> Left "Prelude.read: ambiguous parse"
+ where
+  read' =
+    do x <- readPrec
+       lift P.skipSpaces
+       return x
+
+-- | Parse a string using the 'Read' instance.
+-- Succeeds if there is exactly one valid result.
+readMaybe :: Read a => String -> Maybe a
+readMaybe s = case readEither s of
+                Left _  -> Nothing
+                Right a -> Just a
+#endif
diff --git a/src/Text/Read/Compat.hs b/src/Text/Read/Compat.hs
deleted file mode 100644
--- a/src/Text/Read/Compat.hs
+++ /dev/null
@@ -1,70 +0,0 @@
-{-# LANGUAGE CPP #-}
------------------------------------------------------------------------------
--- |
--- Module      :  Text.Read
--- Copyright   :  (c) The University of Glasgow 2001
--- License     :  BSD-style (see the file libraries/base/LICENSE)
---
--- Maintainer  :  libraries@haskell.org
--- Stability   :  provisional
--- Portability :  non-portable (uses Text.ParserCombinators.ReadP)
---
--- Converting strings to values.
---
--- The "Text.Read" library is the canonical library to import for
--- 'Read'-class facilities.  For GHC only, it offers an extended and much
--- improved 'Read' class, which constitutes a proposed alternative to the
--- Haskell 98 'Read'.  In particular, writing parsers is easier, and
--- the parsers are much more efficient.
---
------------------------------------------------------------------------------
-module Text.Read.Compat (
-   -- * The 'Read' class
-   Read(..),
-   ReadS,
-
-   -- * Haskell 98 functions
-   reads,
-   read,
-   readParen,
-   lex,
-
-   -- * New parsing functions
-   module Text.ParserCombinators.ReadPrec,
-   Lexeme(..),
-   lexP,
-   parens,
-   readListDefault,
-   readListPrecDefault,
-   readEither,
-   readMaybe
-) where
-
-import Text.Read
-import Text.ParserCombinators.ReadPrec
-
-#if !MIN_VERSION_base(4,6,0)
-import qualified Text.ParserCombinators.ReadP as P
-
--- | Parse a string using the 'Read' instance.
--- Succeeds if there is exactly one valid result.
--- A 'Left' value indicates a parse error.
-readEither :: Read a => String -> Either String a
-readEither s =
-  case [ x | (x,"") <- readPrec_to_S read' minPrec s ] of
-    [x] -> Right x
-    []  -> Left "Prelude.read: no parse"
-    _   -> Left "Prelude.read: ambiguous parse"
- where
-  read' =
-    do x <- readPrec
-       lift P.skipSpaces
-       return x
-
--- | Parse a string using the 'Read' instance.
--- Succeeds if there is exactly one valid result.
-readMaybe :: Read a => String -> Maybe a
-readMaybe s = case readEither s of
-                Left _  -> Nothing
-                Right a -> Just a
-#endif
diff --git a/src/Text/Read/Lex.hs b/src/Text/Read/Lex.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Read/Lex.hs
@@ -0,0 +1,4 @@
+module Text.Read.Lex (
+  module Base
+) where
+import "base" Text.Read.Lex as Base
diff --git a/src/Text/Show.hs b/src/Text/Show.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Show.hs
@@ -0,0 +1,4 @@
+module Text.Show (
+  module Base
+) where
+import "base" Text.Show as Base
diff --git a/src/Text/Show/Functions.hs b/src/Text/Show/Functions.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Show/Functions.hs
@@ -0,0 +1,4 @@
+{-# OPTIONS_GHC -fno-warn-dodgy-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+module Text.Show.Functions (module Base) where
+import "base" Text.Show.Functions as Base
diff --git a/src/Unsafe/Coerce.hs b/src/Unsafe/Coerce.hs
new file mode 100644
--- /dev/null
+++ b/src/Unsafe/Coerce.hs
@@ -0,0 +1,4 @@
+module Unsafe.Coerce (
+  module Base
+) where
+import "base" Unsafe.Coerce as Base
