diff --git a/CHANGES.markdown b/CHANGES.markdown
new file mode 100644
--- /dev/null
+++ b/CHANGES.markdown
@@ -0,0 +1,5 @@
+## Changes in 0.10.0 [2018.04.05]
+ - Sync with `base-4.11`/GHC 8.4
+ - This coincides with the `base-compat-0.10` release. Refer to the
+   [`base-compat` changelog](https://github.com/haskell-compat/base-compat/blob/master/base-compat/CHANGES.markdown#changes-in-0100-????????)
+   for details.
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2012-2018 Simon Hengel <sol@typeful.net> and Ryan Scott <ryan.gl.scott@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/README.markdown b/README.markdown
new file mode 100644
--- /dev/null
+++ b/README.markdown
@@ -0,0 +1,34 @@
+# `base-compat` with extra batteries
+[![Hackage](https://img.shields.io/hackage/v/base-compat-batteries.svg)][Hackage: base-compat-batteries]
+[![Hackage Dependencies](https://img.shields.io/hackage-deps/v/base-compat-batteries.svg)](http://packdeps.haskellers.com/reverse/base-compat-batteries)
+[![Haskell Programming Language](https://img.shields.io/badge/language-Haskell-blue.svg)][Haskell.org]
+[![BSD3 License](http://img.shields.io/badge/license-MIT-brightgreen.svg)][tl;dr Legal: MIT]
+
+[Hackage: base-compat-batteries]:
+  http://hackage.haskell.org/package/base-compat-batteries
+  "base-compat-batteries package on Hackage"
+[Haskell.org]:
+  http://www.haskell.org
+  "The Haskell Programming Language"
+[tl;dr Legal: MIT]:
+  https://tldrlegal.com/license/mit-license
+  "MIT License"
+
+## Scope
+
+`base-compat-batteries` provides functions available in later versions of
+`base` to a wider range of compilers, without requiring you to use CPP
+pragmas in your code.
+
+This package provides the same API as the
+[`base-compat`](http://hackage.haskell.org/package/base-compat) library, but
+depends on compatibility packages (such as `semigroups`) to offer a wider
+support window than `base-compat`, which has no dependencies.
+
+Like `base-compat`, `base-compat-batteries` does not add any orphan instances.
+There is a separate package
+[`base-orphans`](https://github.com/haskell-compat/base-orphans) for that.
+
+See [here](https://github.com/haskell-compat/base-compat/blob/master/base-compat/README.markdown#dependencies)
+for a more comprehensive list of differences between `base-compat` and
+`base-compat-batteries`.
diff --git a/Setup.lhs b/Setup.lhs
new file mode 100644
--- /dev/null
+++ b/Setup.lhs
@@ -0,0 +1,3 @@
+#!/usr/bin/env runhaskell
+> import Distribution.Simple
+> main = defaultMain
diff --git a/base-compat-batteries.cabal b/base-compat-batteries.cabal
new file mode 100644
--- /dev/null
+++ b/base-compat-batteries.cabal
@@ -0,0 +1,223 @@
+name:             base-compat-batteries
+version:          0.10.0
+license:          MIT
+license-file:     LICENSE
+copyright:        (c) 2012-2018 Simon Hengel,
+                  (c) 2014-2018 João Cristóvão,
+                  (c) 2015-2018 Ryan Scott
+author:           Simon Hengel <sol@typeful.net>,
+                  João Cristóvão <jmacristovao@gmail.com>,
+                  Ryan Scott <ryan.gl.scott@gmail.com>
+maintainer:       Simon Hengel <sol@typeful.net>,
+                  João Cristóvão <jmacristovao@gmail.com>,
+                  Ryan Scott <ryan.gl.scott@gmail.com>
+build-type:       Simple
+cabal-version:    >= 1.8
+category:         Compatibility
+synopsis:         base-compat with extra batteries
+description:      Provides functions available in later versions of @base@ to
+                  a wider range of compilers, without requiring you to use CPP
+                  pragmas in your code.
+                  .
+                  This package provides the same API as the
+                  @<http://hackage.haskell.org/package/base-compat base-compat>@
+                  library, but depends on compatibility packages
+                  (such as @semigroups@) to offer a wider support window than
+                  @base-compat@, which has no dependencies. Most of the modules
+                  in this library have the same names as in @base-compat@
+                  to make it easier to switch between the two. There also exist
+                  versions of each module with the suffix @.Repl.Batteries@,
+                  which are distinct from anything in @base-compat@, to allow
+                  for easier use in GHCi.
+                  .
+                  See
+                  @<https://github.com/haskell-compat/base-compat/blob/master/base-compat/README.markdown#dependencies here>@
+                  for a more comprehensive list of differences between
+                  @base-compat@ and @base-compat-batteries@.
+tested-with:        GHC == 7.0.1,  GHC == 7.0.2,  GHC == 7.0.3,  GHC == 7.0.4
+                  , GHC == 7.2.1,  GHC == 7.2.2
+                  , GHC == 7.4.1,  GHC == 7.4.2
+                  , GHC == 7.6.1,  GHC == 7.6.2,  GHC == 7.6.3
+                  , GHC == 7.8.1,  GHC == 7.8.2,  GHC == 7.8.3,  GHC == 7.8.4
+                  , GHC == 7.10.1, GHC == 7.10.2, GHC == 7.10.3
+                  , GHC == 8.0.1,  GHC == 8.0.2
+                  , GHC == 8.2.1,  GHC == 8.2.2
+                  , GHC == 8.4.1
+extra-source-files: CHANGES.markdown, README.markdown
+
+source-repository head
+  type: git
+  location: https://github.com/haskell-compat/base-compat
+  subdir: base-compat-batteries
+
+library
+  ghc-options:
+      -Wall
+  build-depends:
+      base        >= 4.3  && < 5,
+      base-compat >= 0.10 && < 0.11
+  if !impl(ghc >= 7.8)
+    build-depends:
+      tagged >= 0.8 && < 0.9
+  if !impl(ghc >= 7.10)
+    build-depends:
+      nats >= 1.1 && < 1.2,
+      void >= 0.7 && < 0.8
+  if !impl(ghc >= 8.0)
+    build-depends:
+      fail                >= 4.9  && < 4.10,
+      semigroups          >= 0.16 && < 0.19,
+      transformers        >= 0.2  && < 0.6,
+      transformers-compat >= 0.3  && < 0.7
+  if !impl(ghc >= 8.2)
+    build-depends:
+      bifunctors >= 5.4.1 && < 5.6
+  ghc-options:
+      -fno-warn-duplicate-exports
+
+  hs-source-dirs:
+      src
+
+  exposed-modules:
+      Control.Concurrent.Compat
+      Control.Concurrent.MVar.Compat
+      Control.Monad.Compat
+      Control.Monad.Fail.Compat
+      Control.Monad.IO.Class.Compat
+      Control.Monad.ST.Lazy.Unsafe.Compat
+      Control.Monad.ST.Unsafe.Compat
+      Data.Bifoldable.Compat
+      Data.Bifunctor.Compat
+      Data.Bitraversable.Compat
+      Data.Bits.Compat
+      Data.Bool.Compat
+      Data.Complex.Compat
+      Data.Either.Compat
+      Data.Foldable.Compat
+      Data.Function.Compat
+      Data.Functor.Compat
+      Data.Functor.Compose.Compat
+      Data.Functor.Const.Compat
+      Data.Functor.Identity.Compat
+      Data.Functor.Product.Compat
+      Data.Functor.Sum.Compat
+      Data.IORef.Compat
+      Data.List.Compat
+      Data.Monoid.Compat
+      Data.Proxy.Compat
+      Data.Ratio.Compat
+      Data.Semigroup.Compat
+      Data.STRef.Compat
+      Data.String.Compat
+      Data.Type.Coercion.Compat
+      Data.Version.Compat
+      Data.Void.Compat
+      Data.Word.Compat
+      Debug.Trace.Compat
+      Foreign.Compat
+      Foreign.ForeignPtr.Compat
+      Foreign.ForeignPtr.Safe.Compat
+      Foreign.ForeignPtr.Unsafe.Compat
+      Foreign.Marshal.Alloc.Compat
+      Foreign.Marshal.Array.Compat
+      Foreign.Marshal.Compat
+      Foreign.Marshal.Safe.Compat
+      Foreign.Marshal.Unsafe.Compat
+      Foreign.Marshal.Utils.Compat
+      Numeric.Compat
+      Numeric.Natural.Compat
+      Prelude.Compat
+      System.Environment.Compat
+      System.Exit.Compat
+      System.IO.Unsafe.Compat
+      Text.Read.Compat
+      Type.Reflection.Compat
+
+      Control.Concurrent.Compat.Repl.Batteries
+      Control.Concurrent.MVar.Compat.Repl.Batteries
+      Control.Monad.Compat.Repl.Batteries
+      Control.Monad.Fail.Compat.Repl.Batteries
+      Control.Monad.IO.Class.Compat.Repl.Batteries
+      Control.Monad.ST.Lazy.Unsafe.Compat.Repl.Batteries
+      Control.Monad.ST.Unsafe.Compat.Repl.Batteries
+      Data.Bifoldable.Compat.Repl.Batteries
+      Data.Bifunctor.Compat.Repl.Batteries
+      Data.Bitraversable.Compat.Repl.Batteries
+      Data.Bits.Compat.Repl.Batteries
+      Data.Bool.Compat.Repl.Batteries
+      Data.Complex.Compat.Repl.Batteries
+      Data.Either.Compat.Repl.Batteries
+      Data.Foldable.Compat.Repl.Batteries
+      Data.Function.Compat.Repl.Batteries
+      Data.Functor.Compat.Repl.Batteries
+      Data.Functor.Compose.Compat.Repl.Batteries
+      Data.Functor.Const.Compat.Repl.Batteries
+      Data.Functor.Identity.Compat.Repl.Batteries
+      Data.Functor.Product.Compat.Repl.Batteries
+      Data.Functor.Sum.Compat.Repl.Batteries
+      Data.IORef.Compat.Repl.Batteries
+      Data.List.Compat.Repl.Batteries
+      Data.Monoid.Compat.Repl.Batteries
+      Data.Proxy.Compat.Repl.Batteries
+      Data.Ratio.Compat.Repl.Batteries
+      Data.Semigroup.Compat.Repl.Batteries
+      Data.STRef.Compat.Repl.Batteries
+      Data.String.Compat.Repl.Batteries
+      Data.Type.Coercion.Compat.Repl.Batteries
+      Data.Version.Compat.Repl.Batteries
+      Data.Void.Compat.Repl.Batteries
+      Data.Word.Compat.Repl.Batteries
+      Debug.Trace.Compat.Repl.Batteries
+      Foreign.Compat.Repl.Batteries
+      Foreign.ForeignPtr.Compat.Repl.Batteries
+      Foreign.ForeignPtr.Safe.Compat.Repl.Batteries
+      Foreign.ForeignPtr.Unsafe.Compat.Repl.Batteries
+      Foreign.Marshal.Alloc.Compat.Repl.Batteries
+      Foreign.Marshal.Array.Compat.Repl.Batteries
+      Foreign.Marshal.Compat.Repl.Batteries
+      Foreign.Marshal.Safe.Compat.Repl.Batteries
+      Foreign.Marshal.Unsafe.Compat.Repl.Batteries
+      Foreign.Marshal.Utils.Compat.Repl.Batteries
+      Numeric.Compat.Repl.Batteries
+      Numeric.Natural.Compat.Repl.Batteries
+      Prelude.Compat.Repl.Batteries
+      System.Environment.Compat.Repl.Batteries
+      System.Exit.Compat.Repl.Batteries
+      System.IO.Unsafe.Compat.Repl.Batteries
+      Text.Read.Compat.Repl.Batteries
+      Type.Reflection.Compat.Repl.Batteries
+test-suite spec
+  type:
+      exitcode-stdio-1.0
+  ghc-options:
+      -Wall
+  hs-source-dirs:
+      test
+  main-is:
+      Spec.hs
+  other-modules:
+      Control.Monad.CompatSpec
+      Data.Bits.CompatSpec
+      Data.Bool.CompatSpec
+      Data.Either.CompatSpec
+      Data.Foldable.CompatSpec
+      Data.Function.CompatSpec
+      Data.Functor.CompatSpec
+      Data.IORef.CompatSpec
+      Data.List.CompatSpec
+      Data.Monoid.CompatSpec
+      Data.STRef.CompatSpec
+      Data.Version.CompatSpec
+      Data.Word.CompatSpec
+      Foreign.Marshal.Alloc.CompatSpec
+      Foreign.Marshal.Utils.CompatSpec
+      Numeric.CompatSpec
+      System.Environment.CompatSpec
+      Text.Read.CompatSpec
+  build-depends:
+      base >= 4.3 && < 5
+    , base-compat-batteries
+    , hspec >= 1.8
+    , QuickCheck
+  build-tool-depends:
+      hspec-discover:hspec-discover >= 1.8
diff --git a/src/Control/Concurrent/Compat.hs b/src/Control/Concurrent/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Concurrent/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Control.Concurrent.Compat (
+  module Base
+) where
+
+import "base-compat" Control.Concurrent.Compat as Base
diff --git a/src/Control/Concurrent/Compat/Repl/Batteries.hs b/src/Control/Concurrent/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Concurrent/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Control.Concurrent.Compat"
+-- from a globally unique namespace.
+module Control.Concurrent.Compat.Repl.Batteries (
+  module Control.Concurrent.Compat
+) where
+import "this" Control.Concurrent.Compat
diff --git a/src/Control/Concurrent/MVar/Compat.hs b/src/Control/Concurrent/MVar/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Concurrent/MVar/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Control.Concurrent.MVar.Compat (
+  module Base
+) where
+
+import "base-compat" Control.Concurrent.MVar.Compat as Base
diff --git a/src/Control/Concurrent/MVar/Compat/Repl/Batteries.hs b/src/Control/Concurrent/MVar/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Concurrent/MVar/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Control.Concurrent.MVar.Compat"
+-- from a globally unique namespace.
+module Control.Concurrent.MVar.Compat.Repl.Batteries (
+  module Control.Concurrent.MVar.Compat
+) where
+import "this" Control.Concurrent.MVar.Compat
diff --git a/src/Control/Monad/Compat.hs b/src/Control/Monad/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Control.Monad.Compat (
+  module Base
+  ) where
+
+import "base-compat" Control.Monad.Compat as Base
diff --git a/src/Control/Monad/Compat/Repl/Batteries.hs b/src/Control/Monad/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Control.Monad.Compat"
+-- from a globally unique namespace.
+module Control.Monad.Compat.Repl.Batteries (
+  module Control.Monad.Compat
+) where
+import "this" Control.Monad.Compat
diff --git a/src/Control/Monad/Fail/Compat.hs b/src/Control/Monad/Fail/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/Fail/Compat.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Control.Monad.Fail.Compat (
+  module Base
+) where
+
+#if MIN_VERSION_base(4,9,0)
+import "base-compat" Control.Monad.Fail.Compat as Base
+#else
+import "fail" Control.Monad.Fail as Base
+#endif
diff --git a/src/Control/Monad/Fail/Compat/Repl/Batteries.hs b/src/Control/Monad/Fail/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/Fail/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Control.Monad.Fail.Compat"
+-- from a globally unique namespace.
+module Control.Monad.Fail.Compat.Repl.Batteries (
+  module Control.Monad.Fail.Compat
+) where
+import "this" Control.Monad.Fail.Compat
diff --git a/src/Control/Monad/IO/Class/Compat.hs b/src/Control/Monad/IO/Class/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/IO/Class/Compat.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Control.Monad.IO.Class.Compat (
+  module Base
+) where
+
+#if MIN_VERSION_base(4,9,0)
+import "base-compat" Control.Monad.IO.Class.Compat as Base
+#else
+import Control.Monad.IO.Class as Base
+#endif
diff --git a/src/Control/Monad/IO/Class/Compat/Repl/Batteries.hs b/src/Control/Monad/IO/Class/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/IO/Class/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Control.Monad.IO.Class.Compat"
+-- from a globally unique namespace.
+module Control.Monad.IO.Class.Compat.Repl.Batteries (
+  module Control.Monad.IO.Class.Compat
+) where
+import "this" Control.Monad.IO.Class.Compat
diff --git a/src/Control/Monad/ST/Lazy/Unsafe/Compat.hs b/src/Control/Monad/ST/Lazy/Unsafe/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/ST/Lazy/Unsafe/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Control.Monad.ST.Lazy.Unsafe.Compat (
+  module Base
+) where
+
+import "base-compat" Control.Monad.ST.Lazy.Unsafe.Compat as Base
diff --git a/src/Control/Monad/ST/Lazy/Unsafe/Compat/Repl/Batteries.hs b/src/Control/Monad/ST/Lazy/Unsafe/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/ST/Lazy/Unsafe/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Control.Monad.ST.Lazy.Unsafe.Compat"
+-- from a globally unique namespace.
+module Control.Monad.ST.Lazy.Unsafe.Compat.Repl.Batteries (
+  module Control.Monad.ST.Lazy.Unsafe.Compat
+) where
+import "this" Control.Monad.ST.Lazy.Unsafe.Compat
diff --git a/src/Control/Monad/ST/Unsafe/Compat.hs b/src/Control/Monad/ST/Unsafe/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/ST/Unsafe/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Control.Monad.ST.Unsafe.Compat (
+  module Base
+) where
+
+import "base-compat" Control.Monad.ST.Unsafe.Compat as Base
diff --git a/src/Control/Monad/ST/Unsafe/Compat/Repl/Batteries.hs b/src/Control/Monad/ST/Unsafe/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/ST/Unsafe/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Control.Monad.ST.Unsafe.Compat"
+-- from a globally unique namespace.
+module Control.Monad.ST.Unsafe.Compat.Repl.Batteries (
+  module Control.Monad.ST.Unsafe.Compat
+) where
+import "this" Control.Monad.ST.Unsafe.Compat
diff --git a/src/Data/Bifoldable/Compat.hs b/src/Data/Bifoldable/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Bifoldable/Compat.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Data.Bifoldable.Compat (
+  module Base
+) where
+
+#if MIN_VERSION_base(4,10,0)
+import "base-compat" Data.Bifoldable.Compat as Base
+#else
+import "bifunctors" Data.Bifoldable as Base
+#endif
diff --git a/src/Data/Bifoldable/Compat/Repl/Batteries.hs b/src/Data/Bifoldable/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Bifoldable/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Data.Bifoldable.Compat"
+-- from a globally unique namespace.
+module Data.Bifoldable.Compat.Repl.Batteries (
+  module Data.Bifoldable.Compat
+) where
+import "this" Data.Bifoldable.Compat
diff --git a/src/Data/Bifunctor/Compat.hs b/src/Data/Bifunctor/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Bifunctor/Compat.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Data.Bifunctor.Compat (
+  module Base
+) where
+
+#if MIN_VERSION_base(4,8,0)
+import "base-compat" Data.Bifunctor.Compat as Base
+#else
+import "bifunctors" Data.Bifunctor as Base
+#endif
diff --git a/src/Data/Bifunctor/Compat/Repl/Batteries.hs b/src/Data/Bifunctor/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Bifunctor/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Data.Bifunctor.Compat"
+-- from a globally unique namespace.
+module Data.Bifunctor.Compat.Repl.Batteries (
+  module Data.Bifunctor.Compat
+) where
+import "this" Data.Bifunctor.Compat
diff --git a/src/Data/Bitraversable/Compat.hs b/src/Data/Bitraversable/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Bitraversable/Compat.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Data.Bitraversable.Compat (
+  module Base
+) where
+
+#if MIN_VERSION_base(4,10,0)
+import "base-compat" Data.Bitraversable.Compat as Base
+#else
+import "bifunctors" Data.Bitraversable as Base
+#endif
diff --git a/src/Data/Bitraversable/Compat/Repl/Batteries.hs b/src/Data/Bitraversable/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Bitraversable/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Data.Bitraversable.Compat"
+-- from a globally unique namespace.
+module Data.Bitraversable.Compat.Repl.Batteries (
+  module Data.Bitraversable.Compat
+) where
+import "this" Data.Bitraversable.Compat
diff --git a/src/Data/Bits/Compat.hs b/src/Data/Bits/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Bits/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Data.Bits.Compat (
+  module Base
+) where
+
+import "base-compat" Data.Bits.Compat as Base
diff --git a/src/Data/Bits/Compat/Repl/Batteries.hs b/src/Data/Bits/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Bits/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Data.Bits.Compat"
+-- from a globally unique namespace.
+module Data.Bits.Compat.Repl.Batteries (
+  module Data.Bits.Compat
+) where
+import "this" Data.Bits.Compat
diff --git a/src/Data/Bool/Compat.hs b/src/Data/Bool/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Bool/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Data.Bool.Compat (
+  module Base
+) where
+
+import "base-compat" Data.Bool.Compat as Base
diff --git a/src/Data/Bool/Compat/Repl/Batteries.hs b/src/Data/Bool/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Bool/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Data.Bool.Compat"
+-- from a globally unique namespace.
+module Data.Bool.Compat.Repl.Batteries (
+  module Data.Bool.Compat
+) where
+import "this" Data.Bool.Compat
diff --git a/src/Data/Complex/Compat.hs b/src/Data/Complex/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Complex/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Data.Complex.Compat (
+  module Base
+) where
+
+import "base-compat" Data.Complex.Compat as Base
diff --git a/src/Data/Complex/Compat/Repl/Batteries.hs b/src/Data/Complex/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Complex/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Data.Complex.Compat"
+-- from a globally unique namespace.
+module Data.Complex.Compat.Repl.Batteries (
+  module Data.Complex.Compat
+) where
+import "this" Data.Complex.Compat
diff --git a/src/Data/Either/Compat.hs b/src/Data/Either/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Either/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Data.Either.Compat (
+  module Base
+) where
+
+import "base-compat" Data.Either.Compat as Base
diff --git a/src/Data/Either/Compat/Repl/Batteries.hs b/src/Data/Either/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Either/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Data.Either.Compat"
+-- from a globally unique namespace.
+module Data.Either.Compat.Repl.Batteries (
+  module Data.Either.Compat
+) where
+import "this" Data.Either.Compat
diff --git a/src/Data/Foldable/Compat.hs b/src/Data/Foldable/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Foldable/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Data.Foldable.Compat (
+  module Base
+) where
+
+import "base-compat" Data.Foldable.Compat as Base
diff --git a/src/Data/Foldable/Compat/Repl/Batteries.hs b/src/Data/Foldable/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Foldable/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Data.Foldable.Compat"
+-- from a globally unique namespace.
+module Data.Foldable.Compat.Repl.Batteries (
+  module Data.Foldable.Compat
+) where
+import "this" Data.Foldable.Compat
diff --git a/src/Data/Function/Compat.hs b/src/Data/Function/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Function/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Data.Function.Compat (
+  module Base
+) where
+
+import "base-compat" Data.Function.Compat as Base
diff --git a/src/Data/Function/Compat/Repl/Batteries.hs b/src/Data/Function/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Function/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Data.Function.Compat"
+-- from a globally unique namespace.
+module Data.Function.Compat.Repl.Batteries (
+  module Data.Function.Compat
+) where
+import "this" Data.Function.Compat
diff --git a/src/Data/Functor/Compat.hs b/src/Data/Functor/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Functor/Compat.hs
@@ -0,0 +1,51 @@
+{-# LANGUAGE CPP, NoImplicitPrelude #-}
+module Data.Functor.Compat (
+  module Base
+, Functor(..)
+, ($>)
+, void
+, (<&>)
+) where
+import Data.Functor as Base
+
+#if !(MIN_VERSION_base(4,7,0))
+import Control.Monad.Compat (void)
+import Data.Function (flip)
+#endif
+
+#if !(MIN_VERSION_base(4,7,0))
+infixl 4 $>
+
+-- | Flipped version of '$>'.
+--
+-- /Since: 4.7.0.0/
+($>) :: Functor f => f a -> b -> f b
+($>) = flip (<$)
+#endif
+
+#if !(MIN_VERSION_base(4,11,0))
+-- | Flipped version of '<$>'.
+--
+-- @
+-- ('<&>') = 'flip' 'fmap'
+-- @
+--
+-- /Since: 4.11.0.0/
+--
+-- ==== __Examples__
+-- Apply @(+1)@ to a list, a 'Data.Maybe.Just' and a 'Data.Either.Right':
+--
+-- >>> Just 2 <&> (+1)
+-- Just 3
+--
+-- >>> [1,2,3] <&> (+1)
+-- [2,3,4]
+--
+-- >>> Right 3 <&> (+1)
+-- Right 4
+--
+(<&>) :: Functor f => f a -> (a -> b) -> f b
+as <&> f = f <$> as
+
+infixl 1 <&>
+#endif
diff --git a/src/Data/Functor/Compat/Repl/Batteries.hs b/src/Data/Functor/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Functor/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Data.Functor.Compat"
+-- from a globally unique namespace.
+module Data.Functor.Compat.Repl.Batteries (
+  module Data.Functor.Compat
+) where
+import "this" Data.Functor.Compat
diff --git a/src/Data/Functor/Compose/Compat.hs b/src/Data/Functor/Compose/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Functor/Compose/Compat.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Data.Functor.Compose.Compat (
+  module Base
+) where
+
+#if MIN_VERSION_base(4,9,0)
+import "base-compat" Data.Functor.Compose.Compat as Base
+#else
+import Data.Functor.Compose as Base
+#endif
diff --git a/src/Data/Functor/Compose/Compat/Repl/Batteries.hs b/src/Data/Functor/Compose/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Functor/Compose/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Data.Functor.Compose.Compat"
+-- from a globally unique namespace.
+module Data.Functor.Compose.Compat.Repl.Batteries (
+  module Data.Functor.Compose.Compat
+) where
+import "this" Data.Functor.Compose.Compat
diff --git a/src/Data/Functor/Const/Compat.hs b/src/Data/Functor/Const/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Functor/Const/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Data.Functor.Const.Compat (
+  module Base
+) where
+
+import "base-compat" Data.Functor.Const.Compat as Base
diff --git a/src/Data/Functor/Const/Compat/Repl/Batteries.hs b/src/Data/Functor/Const/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Functor/Const/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Data.Functor.Const.Compat"
+-- from a globally unique namespace.
+module Data.Functor.Const.Compat.Repl.Batteries (
+  module Data.Functor.Const.Compat
+) where
+import "this" Data.Functor.Const.Compat
diff --git a/src/Data/Functor/Identity/Compat.hs b/src/Data/Functor/Identity/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Functor/Identity/Compat.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Data.Functor.Identity.Compat (
+  module Base
+) where
+
+#if MIN_VERSION_base(4,8,0)
+import "base-compat" Data.Functor.Identity.Compat as Base
+#else
+import Data.Functor.Identity as Base
+#endif
diff --git a/src/Data/Functor/Identity/Compat/Repl/Batteries.hs b/src/Data/Functor/Identity/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Functor/Identity/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Data.Functor.Identity.Compat"
+-- from a globally unique namespace.
+module Data.Functor.Identity.Compat.Repl.Batteries (
+  module Data.Functor.Identity.Compat
+) where
+import "this" Data.Functor.Identity.Compat
diff --git a/src/Data/Functor/Product/Compat.hs b/src/Data/Functor/Product/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Functor/Product/Compat.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Data.Functor.Product.Compat (
+  module Base
+) where
+
+#if MIN_VERSION_base(4,9,0)
+import "base-compat" Data.Functor.Product.Compat as Base
+#else
+import Data.Functor.Product as Base
+#endif
diff --git a/src/Data/Functor/Product/Compat/Repl/Batteries.hs b/src/Data/Functor/Product/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Functor/Product/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Data.Functor.Product.Compat"
+-- from a globally unique namespace.
+module Data.Functor.Product.Compat.Repl.Batteries (
+  module Data.Functor.Product.Compat
+) where
+import "this" Data.Functor.Product.Compat
diff --git a/src/Data/Functor/Sum/Compat.hs b/src/Data/Functor/Sum/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Functor/Sum/Compat.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Data.Functor.Sum.Compat (
+  module Base
+) where
+
+#if MIN_VERSION_base(4,9,0)
+import "base-compat" Data.Functor.Sum.Compat as Base
+#else
+import Data.Functor.Sum as Base
+#endif
diff --git a/src/Data/Functor/Sum/Compat/Repl/Batteries.hs b/src/Data/Functor/Sum/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Functor/Sum/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Data.Functor.Sum.Compat"
+-- from a globally unique namespace.
+module Data.Functor.Sum.Compat.Repl.Batteries (
+  module Data.Functor.Sum.Compat
+) where
+import "this" Data.Functor.Sum.Compat
diff --git a/src/Data/IORef/Compat.hs b/src/Data/IORef/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/IORef/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Data.IORef.Compat (
+  module Base
+) where
+
+import "base-compat" Data.IORef.Compat as Base
diff --git a/src/Data/IORef/Compat/Repl/Batteries.hs b/src/Data/IORef/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/IORef/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Data.IORef.Compat"
+-- from a globally unique namespace.
+module Data.IORef.Compat.Repl.Batteries (
+  module Data.IORef.Compat
+) where
+import "this" Data.IORef.Compat
diff --git a/src/Data/List/Compat.hs b/src/Data/List/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/List/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Data.List.Compat (
+  module Base
+) where
+
+import "base-compat" Data.List.Compat as Base
diff --git a/src/Data/List/Compat/Repl/Batteries.hs b/src/Data/List/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/List/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Data.List.Compat"
+-- from a globally unique namespace.
+module Data.List.Compat.Repl.Batteries (
+  module Data.List.Compat
+) where
+import "this" Data.List.Compat
diff --git a/src/Data/Monoid/Compat.hs b/src/Data/Monoid/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Monoid/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Data.Monoid.Compat (
+  module Base
+) where
+
+import "base-compat" Data.Monoid.Compat as Base
diff --git a/src/Data/Monoid/Compat/Repl/Batteries.hs b/src/Data/Monoid/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Monoid/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Data.Monoid.Compat"
+-- from a globally unique namespace.
+module Data.Monoid.Compat.Repl.Batteries (
+  module Data.Monoid.Compat
+) where
+import "this" Data.Monoid.Compat
diff --git a/src/Data/Proxy/Compat.hs b/src/Data/Proxy/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Proxy/Compat.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Data.Proxy.Compat (
+  module Base
+) where
+
+#if MIN_VERSION_base(4,7,0)
+import "base-compat" Data.Proxy.Compat as Base
+#else
+import "tagged" Data.Proxy as Base
+#endif
diff --git a/src/Data/Proxy/Compat/Repl/Batteries.hs b/src/Data/Proxy/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Proxy/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Data.Proxy.Compat"
+-- from a globally unique namespace.
+module Data.Proxy.Compat.Repl.Batteries (
+  module Data.Proxy.Compat
+) where
+import "this" Data.Proxy.Compat
diff --git a/src/Data/Ratio/Compat.hs b/src/Data/Ratio/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Ratio/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Data.Ratio.Compat (
+  module Base
+) where
+
+import "base-compat" Data.Ratio.Compat as Base
diff --git a/src/Data/Ratio/Compat/Repl/Batteries.hs b/src/Data/Ratio/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Ratio/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Data.Ratio.Compat"
+-- from a globally unique namespace.
+module Data.Ratio.Compat.Repl.Batteries (
+  module Data.Ratio.Compat
+) where
+import "this" Data.Ratio.Compat
diff --git a/src/Data/STRef/Compat.hs b/src/Data/STRef/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/STRef/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Data.STRef.Compat (
+  module Base
+) where
+
+import "base-compat" Data.STRef.Compat as Base
diff --git a/src/Data/STRef/Compat/Repl/Batteries.hs b/src/Data/STRef/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/STRef/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Data.STRef.Compat"
+-- from a globally unique namespace.
+module Data.STRef.Compat.Repl.Batteries (
+  module Data.STRef.Compat
+) where
+import "this" Data.STRef.Compat
diff --git a/src/Data/Semigroup/Compat.hs b/src/Data/Semigroup/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Semigroup/Compat.hs
@@ -0,0 +1,37 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Data.Semigroup.Compat (
+    Semigroup(..)
+  , stimesMonoid
+  , stimesIdempotent
+  , stimesIdempotentMonoid
+  , mtimesDefault
+  -- * Semigroups
+  , Min(..)
+  , Max(..)
+  , First(..)
+  , Last(..)
+  , WrappedMonoid(..)
+  -- * Re-exported monoids from Data.Monoid
+  , Dual(..)
+  , Endo(..)
+  , All(..)
+  , Any(..)
+  , Sum(..)
+  , Product(..)
+  -- * A better monoid for Maybe
+  , Option(..)
+  , option
+  -- * Difference lists of a semigroup
+  , diff
+  , cycle1
+  -- * ArgMin, ArgMax
+  , Arg(..)
+  , ArgMin
+  , ArgMax
+  ) where
+
+#if MIN_VERSION_base(4,9,0)
+import "base-compat" Data.Semigroup.Compat
+#else
+import "semigroups" Data.Semigroup
+#endif
diff --git a/src/Data/Semigroup/Compat/Repl/Batteries.hs b/src/Data/Semigroup/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Semigroup/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Data.Semigroup.Compat"
+-- from a globally unique namespace.
+module Data.Semigroup.Compat.Repl.Batteries (
+  module Data.Semigroup.Compat
+) where
+import "this" Data.Semigroup.Compat
diff --git a/src/Data/String/Compat.hs b/src/Data/String/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/String/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Data.String.Compat (
+  module Base
+) where
+
+import "base-compat" Data.String.Compat as Base
diff --git a/src/Data/String/Compat/Repl/Batteries.hs b/src/Data/String/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/String/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Data.String.Compat"
+-- from a globally unique namespace.
+module Data.String.Compat.Repl.Batteries (
+  module Data.String.Compat
+) where
+import "this" Data.String.Compat
diff --git a/src/Data/Type/Coercion/Compat.hs b/src/Data/Type/Coercion/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Type/Coercion/Compat.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Data.Type.Coercion.Compat (
+#if MIN_VERSION_base(4,7,0)
+  module Base
+#endif
+) where
+
+#if MIN_VERSION_base(4,7,0)
+import "base-compat" Data.Type.Coercion.Compat as Base
+#endif
diff --git a/src/Data/Type/Coercion/Compat/Repl/Batteries.hs b/src/Data/Type/Coercion/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Type/Coercion/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Data.Type.Coercion.Compat"
+-- from a globally unique namespace.
+module Data.Type.Coercion.Compat.Repl.Batteries (
+  module Data.Type.Coercion.Compat
+) where
+import "this" Data.Type.Coercion.Compat
diff --git a/src/Data/Version/Compat.hs b/src/Data/Version/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Version/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Data.Version.Compat (
+  module Base
+) where
+
+import "base-compat" Data.Version.Compat as Base
diff --git a/src/Data/Version/Compat/Repl/Batteries.hs b/src/Data/Version/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Version/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Data.Version.Compat"
+-- from a globally unique namespace.
+module Data.Version.Compat.Repl.Batteries (
+  module Data.Version.Compat
+) where
+import "this" Data.Version.Compat
diff --git a/src/Data/Void/Compat.hs b/src/Data/Void/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Void/Compat.hs
@@ -0,0 +1,12 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Data.Void.Compat (
+  Void
+, absurd
+, vacuous
+) where
+
+#if MIN_VERSION_base(4,8,0)
+import "base-compat" Data.Void.Compat as Base
+#else
+import "void" Data.Void as Base
+#endif
diff --git a/src/Data/Void/Compat/Repl/Batteries.hs b/src/Data/Void/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Void/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Data.Void.Compat"
+-- from a globally unique namespace.
+module Data.Void.Compat.Repl.Batteries (
+  module Data.Void.Compat
+) where
+import "this" Data.Void.Compat
diff --git a/src/Data/Word/Compat.hs b/src/Data/Word/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Word/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Data.Word.Compat (
+  module Base
+) where
+
+import "base-compat" Data.Word.Compat as Base
diff --git a/src/Data/Word/Compat/Repl/Batteries.hs b/src/Data/Word/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Word/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Data.Word.Compat"
+-- from a globally unique namespace.
+module Data.Word.Compat.Repl.Batteries (
+  module Data.Word.Compat
+) where
+import "this" Data.Word.Compat
diff --git a/src/Debug/Trace/Compat.hs b/src/Debug/Trace/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Debug/Trace/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Debug.Trace.Compat (
+  module Base
+) where
+
+import "base-compat" Debug.Trace.Compat as Base
diff --git a/src/Debug/Trace/Compat/Repl/Batteries.hs b/src/Debug/Trace/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Debug/Trace/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Debug.Trace.Compat"
+-- from a globally unique namespace.
+module Debug.Trace.Compat.Repl.Batteries (
+  module Debug.Trace.Compat
+) where
+import "this" Debug.Trace.Compat
diff --git a/src/Foreign/Compat.hs b/src/Foreign/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Foreign.Compat (
+  module Base
+) where
+
+import "base-compat" Foreign.Compat as Base
diff --git a/src/Foreign/Compat/Repl/Batteries.hs b/src/Foreign/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Foreign.Compat"
+-- from a globally unique namespace.
+module Foreign.Compat.Repl.Batteries (
+  module Foreign.Compat
+) where
+import "this" Foreign.Compat
diff --git a/src/Foreign/ForeignPtr/Compat.hs b/src/Foreign/ForeignPtr/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/ForeignPtr/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Foreign.ForeignPtr.Compat (
+  module Base
+) where
+
+import "base-compat" Foreign.ForeignPtr.Compat as Base
diff --git a/src/Foreign/ForeignPtr/Compat/Repl/Batteries.hs b/src/Foreign/ForeignPtr/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/ForeignPtr/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Foreign.ForeignPtr.Compat"
+-- from a globally unique namespace.
+module Foreign.ForeignPtr.Compat.Repl.Batteries (
+  module Foreign.ForeignPtr.Compat
+) where
+import "this" Foreign.ForeignPtr.Compat
diff --git a/src/Foreign/ForeignPtr/Safe/Compat.hs b/src/Foreign/ForeignPtr/Safe/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/ForeignPtr/Safe/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Foreign.ForeignPtr.Safe.Compat (
+  module Base
+) where
+
+import "base-compat" Foreign.ForeignPtr.Safe.Compat as Base
diff --git a/src/Foreign/ForeignPtr/Safe/Compat/Repl/Batteries.hs b/src/Foreign/ForeignPtr/Safe/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/ForeignPtr/Safe/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Foreign.ForeignPtr.Safe.Compat"
+-- from a globally unique namespace.
+module Foreign.ForeignPtr.Safe.Compat.Repl.Batteries (
+  module Foreign.ForeignPtr.Safe.Compat
+) where
+import "this" Foreign.ForeignPtr.Safe.Compat
diff --git a/src/Foreign/ForeignPtr/Unsafe/Compat.hs b/src/Foreign/ForeignPtr/Unsafe/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/ForeignPtr/Unsafe/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Foreign.ForeignPtr.Unsafe.Compat (
+  module Base
+) where
+
+import "base-compat" Foreign.ForeignPtr.Unsafe.Compat as Base
diff --git a/src/Foreign/ForeignPtr/Unsafe/Compat/Repl/Batteries.hs b/src/Foreign/ForeignPtr/Unsafe/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/ForeignPtr/Unsafe/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Foreign.ForeignPtr.Unsafe.Compat"
+-- from a globally unique namespace.
+module Foreign.ForeignPtr.Unsafe.Compat.Repl.Batteries (
+  module Foreign.ForeignPtr.Unsafe.Compat
+) where
+import "this" Foreign.ForeignPtr.Unsafe.Compat
diff --git a/src/Foreign/Marshal/Alloc/Compat.hs b/src/Foreign/Marshal/Alloc/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Marshal/Alloc/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Foreign.Marshal.Alloc.Compat (
+  module Base
+) where
+
+import "base-compat" Foreign.Marshal.Alloc.Compat as Base
diff --git a/src/Foreign/Marshal/Alloc/Compat/Repl/Batteries.hs b/src/Foreign/Marshal/Alloc/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Marshal/Alloc/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Foreign.Marshal.Alloc.Compat"
+-- from a globally unique namespace.
+module Foreign.Marshal.Alloc.Compat.Repl.Batteries (
+  module Foreign.Marshal.Alloc.Compat
+) where
+import "this" Foreign.Marshal.Alloc.Compat
diff --git a/src/Foreign/Marshal/Array/Compat.hs b/src/Foreign/Marshal/Array/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Marshal/Array/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Foreign.Marshal.Array.Compat (
+  module Base
+) where
+
+import "base-compat" Foreign.Marshal.Array.Compat as Base
diff --git a/src/Foreign/Marshal/Array/Compat/Repl/Batteries.hs b/src/Foreign/Marshal/Array/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Marshal/Array/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Foreign.Marshal.Array.Compat"
+-- from a globally unique namespace.
+module Foreign.Marshal.Array.Compat.Repl.Batteries (
+  module Foreign.Marshal.Array.Compat
+) where
+import "this" Foreign.Marshal.Array.Compat
diff --git a/src/Foreign/Marshal/Compat.hs b/src/Foreign/Marshal/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Marshal/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Foreign.Marshal.Compat (
+  module Base
+) where
+
+import "base-compat" Foreign.Marshal.Compat as Base
diff --git a/src/Foreign/Marshal/Compat/Repl/Batteries.hs b/src/Foreign/Marshal/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Marshal/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Foreign.Marshal.Compat"
+-- from a globally unique namespace.
+module Foreign.Marshal.Compat.Repl.Batteries (
+  module Foreign.Marshal.Compat
+) where
+import "this" Foreign.Marshal.Compat
diff --git a/src/Foreign/Marshal/Safe/Compat.hs b/src/Foreign/Marshal/Safe/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Marshal/Safe/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Foreign.Marshal.Safe.Compat (
+  module Base
+) where
+
+import "base-compat" Foreign.Marshal.Safe.Compat as Base
diff --git a/src/Foreign/Marshal/Safe/Compat/Repl/Batteries.hs b/src/Foreign/Marshal/Safe/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Marshal/Safe/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Foreign.Marshal.Safe.Compat"
+-- from a globally unique namespace.
+module Foreign.Marshal.Safe.Compat.Repl.Batteries (
+  module Foreign.Marshal.Safe.Compat
+) where
+import "this" Foreign.Marshal.Safe.Compat
diff --git a/src/Foreign/Marshal/Unsafe/Compat.hs b/src/Foreign/Marshal/Unsafe/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Marshal/Unsafe/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Foreign.Marshal.Unsafe.Compat (
+  module Base
+) where
+
+import "base-compat" Foreign.Marshal.Unsafe.Compat as Base
diff --git a/src/Foreign/Marshal/Unsafe/Compat/Repl/Batteries.hs b/src/Foreign/Marshal/Unsafe/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Marshal/Unsafe/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Foreign.Marshal.Unsafe.Compat"
+-- from a globally unique namespace.
+module Foreign.Marshal.Unsafe.Compat.Repl.Batteries (
+  module Foreign.Marshal.Unsafe.Compat
+) where
+import "this" Foreign.Marshal.Unsafe.Compat
diff --git a/src/Foreign/Marshal/Utils/Compat.hs b/src/Foreign/Marshal/Utils/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Marshal/Utils/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Foreign.Marshal.Utils.Compat (
+  module Base
+) where
+
+import "base-compat" Foreign.Marshal.Utils.Compat as Base
diff --git a/src/Foreign/Marshal/Utils/Compat/Repl/Batteries.hs b/src/Foreign/Marshal/Utils/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Marshal/Utils/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Foreign.Marshal.Utils.Compat"
+-- from a globally unique namespace.
+module Foreign.Marshal.Utils.Compat.Repl.Batteries (
+  module Foreign.Marshal.Utils.Compat
+) where
+import "this" Foreign.Marshal.Utils.Compat
diff --git a/src/Numeric/Compat.hs b/src/Numeric/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Numeric/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Numeric.Compat (
+  module Base
+) where
+
+import "base-compat" Numeric.Compat as Base
diff --git a/src/Numeric/Compat/Repl/Batteries.hs b/src/Numeric/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Numeric/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Numeric.Compat"
+-- from a globally unique namespace.
+module Numeric.Compat.Repl.Batteries (
+  module Numeric.Compat
+) where
+import "this" Numeric.Compat
diff --git a/src/Numeric/Natural/Compat.hs b/src/Numeric/Natural/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Numeric/Natural/Compat.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Numeric.Natural.Compat (
+  module Base
+) where
+
+#if MIN_VERSION_base(4,8,0)
+import "base-compat" Numeric.Natural.Compat as Base
+#else
+import "nats" Numeric.Natural as Base
+#endif
diff --git a/src/Numeric/Natural/Compat/Repl/Batteries.hs b/src/Numeric/Natural/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Numeric/Natural/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Numeric.Natural.Compat"
+-- from a globally unique namespace.
+module Numeric.Natural.Compat.Repl.Batteries (
+  module Numeric.Natural.Compat
+) where
+import "this" Numeric.Natural.Compat
diff --git a/src/Prelude/Compat.hs b/src/Prelude/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Prelude/Compat.hs
@@ -0,0 +1,13 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Prelude.Compat (
+  module Base
+#if !(MIN_VERSION_base(4,9,0))
+, Semi.Semigroup((Semi.<>))
+#endif
+) where
+
+import "base-compat" Prelude.Compat as Base
+
+#if !(MIN_VERSION_base(4,9,0))
+import "semigroups" Data.Semigroup as Semi
+#endif
diff --git a/src/Prelude/Compat/Repl/Batteries.hs b/src/Prelude/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Prelude/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Prelude.Compat"
+-- from a globally unique namespace.
+module Prelude.Compat.Repl.Batteries (
+  module Prelude.Compat
+) where
+import "this" Prelude.Compat
diff --git a/src/System/Environment/Compat.hs b/src/System/Environment/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/System/Environment/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module System.Environment.Compat (
+  module Base
+) where
+
+import "base-compat" System.Environment.Compat as Base
diff --git a/src/System/Environment/Compat/Repl/Batteries.hs b/src/System/Environment/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/System/Environment/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "System.Environment.Compat"
+-- from a globally unique namespace.
+module System.Environment.Compat.Repl.Batteries (
+  module System.Environment.Compat
+) where
+import "this" System.Environment.Compat
diff --git a/src/System/Exit/Compat.hs b/src/System/Exit/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/System/Exit/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module System.Exit.Compat (
+  module Base
+) where
+
+import "base-compat" System.Exit.Compat as Base
diff --git a/src/System/Exit/Compat/Repl/Batteries.hs b/src/System/Exit/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/System/Exit/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "System.Exit.Compat"
+-- from a globally unique namespace.
+module System.Exit.Compat.Repl.Batteries (
+  module System.Exit.Compat
+) where
+import "this" System.Exit.Compat
diff --git a/src/System/IO/Unsafe/Compat.hs b/src/System/IO/Unsafe/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/System/IO/Unsafe/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module System.IO.Unsafe.Compat (
+  module Base
+) where
+
+import "base-compat" System.IO.Unsafe.Compat as Base
diff --git a/src/System/IO/Unsafe/Compat/Repl/Batteries.hs b/src/System/IO/Unsafe/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/System/IO/Unsafe/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "System.IO.Unsafe.Compat"
+-- from a globally unique namespace.
+module System.IO.Unsafe.Compat.Repl.Batteries (
+  module System.IO.Unsafe.Compat
+) where
+import "this" System.IO.Unsafe.Compat
diff --git a/src/Text/Read/Compat.hs b/src/Text/Read/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Read/Compat.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE CPP, NoImplicitPrelude, PackageImports #-}
+module Text.Read.Compat (
+  module Base
+) where
+
+import "base-compat" Text.Read.Compat as Base
diff --git a/src/Text/Read/Compat/Repl/Batteries.hs b/src/Text/Read/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Read/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Text.Read.Compat"
+-- from a globally unique namespace.
+module Text.Read.Compat.Repl.Batteries (
+  module Text.Read.Compat
+) where
+import "this" Text.Read.Compat
diff --git a/src/Type/Reflection/Compat.hs b/src/Type/Reflection/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Type/Reflection/Compat.hs
@@ -0,0 +1,34 @@
+{-# LANGUAGE CPP, NoImplicitPrelude #-}
+#if MIN_VERSION_base(4,10,0) && !(MIN_VERSION_base(4,11,0))
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeInType #-}
+#endif
+module Type.Reflection.Compat (
+#if MIN_VERSION_base(4,10,0)
+  module Base
+, withTypeable
+#endif
+) where
+
+#if MIN_VERSION_base(4,11,0)
+import Type.Reflection as Base
+#elif MIN_VERSION_base(4,10,0)
+import Type.Reflection as Base hiding (withTypeable)
+#endif
+
+#if MIN_VERSION_base(4,10,0) && !(MIN_VERSION_base(4,11,0))
+import GHC.Exts (TYPE)
+import Type.Reflection (Typeable, TypeRep)
+import Unsafe.Coerce (unsafeCoerce)
+
+-- | Use a 'TypeRep' as 'Typeable' evidence.
+withTypeable :: forall (a :: k) (r :: TYPE rep). ()
+             => TypeRep a -> (Typeable a => r) -> r
+withTypeable rep k = unsafeCoerce k' rep
+  where k' :: Gift a r
+        k' = Gift k
+
+-- | A helper to satisfy the type checker in 'withTypeable'.
+newtype Gift a (r :: TYPE rep) = Gift (Typeable a => r)
+#endif
diff --git a/src/Type/Reflection/Compat/Repl/Batteries.hs b/src/Type/Reflection/Compat/Repl/Batteries.hs
new file mode 100644
--- /dev/null
+++ b/src/Type/Reflection/Compat/Repl/Batteries.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Type.Reflection.Compat"
+-- from a globally unique namespace.
+module Type.Reflection.Compat.Repl.Batteries (
+  module Type.Reflection.Compat
+) where
+import "this" Type.Reflection.Compat
diff --git a/test/Control/Monad/CompatSpec.hs b/test/Control/Monad/CompatSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Control/Monad/CompatSpec.hs
@@ -0,0 +1,16 @@
+module Control.Monad.CompatSpec (main, spec) where
+
+import           Test.Hspec
+
+import           Control.Monad.Compat
+import           Prelude ()
+import           Prelude.Compat
+
+main :: IO ()
+main = hspec spec
+
+spec :: Spec
+spec = do
+  describe "(<$!>)" $ do
+    it "is a strict version of (<$>)" $ do
+      not <$!> [True, False] `shouldBe` not <$> [True, False]
diff --git a/test/Data/Bits/CompatSpec.hs b/test/Data/Bits/CompatSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Data/Bits/CompatSpec.hs
@@ -0,0 +1,34 @@
+{-# LANGUAGE CPP #-}
+module Data.Bits.CompatSpec (main, spec) where
+
+import Test.Hspec
+import Data.Bits.Compat
+
+main :: IO ()
+main = hspec spec
+
+spec :: Spec
+spec = do
+  describe "bitDefault" $
+    it "sets the ith bit with all other bits clear" $ do
+      bitDefault 0 `shouldBe` (1 :: Int)
+      bitDefault 1 `shouldBe` (2 :: Int)
+      bitDefault 2 `shouldBe` (4 :: Int)
+      bitDefault 3 `shouldBe` (8 :: Int)
+  describe "testBitDefault" $
+    it "returns True if the nth bit of the argument is 1" $ do
+      testBitDefault (10 :: Int) 0 `shouldBe` False
+      testBitDefault (10 :: Int) 1 `shouldBe` True
+      testBitDefault (10 :: Int) 2 `shouldBe` False
+      testBitDefault (10 :: Int) 3 `shouldBe` True
+  describe "popCountDefault" $
+    it "returns the number of set bits in the argument" $ do
+      popCountDefault (0  :: Int) `shouldBe` 0
+      popCountDefault (1  :: Int) `shouldBe` 1
+      popCountDefault (10 :: Int) `shouldBe` 2
+#if MIN_VERSION_base(4,7,0)
+  describe "toIntegralSized" $
+    it "converts an Integral type to another as measured by bitSizeMaybe" $ do
+      toIntegralSized (42 :: Integer)                   `shouldBe` (Just 42 :: Maybe Int)
+      toIntegralSized (12345678901234567890 :: Integer) `shouldBe` (Nothing :: Maybe Int)
+#endif
diff --git a/test/Data/Bool/CompatSpec.hs b/test/Data/Bool/CompatSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Data/Bool/CompatSpec.hs
@@ -0,0 +1,18 @@
+module Data.Bool.CompatSpec (main, spec) where
+
+import           Test.Hspec
+
+import           Data.Bool.Compat
+
+main :: IO ()
+main = hspec spec
+
+spec :: Spec
+spec = do
+  describe "bool" $ do
+    it "evaluates to first parameter if condition is False" $ do
+      bool "KO" "OK" False `shouldBe` "KO"
+
+    it "evaluates to second parameter if condition is True" $ do
+      bool "KO" "OK" True `shouldBe` "OK"
+
diff --git a/test/Data/Either/CompatSpec.hs b/test/Data/Either/CompatSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Data/Either/CompatSpec.hs
@@ -0,0 +1,25 @@
+module Data.Either.CompatSpec (main, spec) where
+
+import           Test.Hspec
+
+import           Data.Either.Compat
+
+main :: IO ()
+main = hspec spec
+
+spec :: Spec
+spec = do
+  describe "isLeft" $ do
+    it "returns True for a Left value" $ do
+      isLeft (Left "23" :: Either String String) `shouldBe` True
+
+    it "returns False for a Right value" $ do
+      isLeft (Right "23" :: Either String String) `shouldBe` False
+
+  describe "isRight" $ do
+    it "returns False for a Left value" $ do
+      isRight (Left "23" :: Either String String) `shouldBe` False
+
+    it "returns True for a Right value" $ do
+      isRight (Right "23" :: Either String String) `shouldBe` True
+
diff --git a/test/Data/Foldable/CompatSpec.hs b/test/Data/Foldable/CompatSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Data/Foldable/CompatSpec.hs
@@ -0,0 +1,13 @@
+module Data.Foldable.CompatSpec (main, spec) where
+
+import            Test.Hspec
+import            Data.Foldable.Compat
+
+main :: IO ()
+main = hspec spec
+
+spec :: Spec
+spec = do
+  describe "maximumBy" $ do
+    it "runs in constant space" $ do
+      maximumBy compare [1..10000] `shouldBe` (10000 :: Int)
diff --git a/test/Data/Function/CompatSpec.hs b/test/Data/Function/CompatSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Data/Function/CompatSpec.hs
@@ -0,0 +1,13 @@
+module Data.Function.CompatSpec (main, spec) where
+
+import           Test.Hspec
+import           Data.Function.Compat
+
+main :: IO ()
+main = hspec spec
+
+spec :: Spec
+spec = do
+  describe "&" $ do
+    it "reverses function application" $ do
+      (False & not) `shouldBe` True
diff --git a/test/Data/Functor/CompatSpec.hs b/test/Data/Functor/CompatSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Data/Functor/CompatSpec.hs
@@ -0,0 +1,17 @@
+module Data.Functor.CompatSpec (main, spec) where
+
+import           Test.Hspec
+import           Data.Functor.Compat
+
+main :: IO ()
+main = hspec spec
+
+spec :: Spec
+spec = do
+  describe "void" $ do
+    it "discards computation result" $ do
+      void (return 1 :: IO Int) `shouldReturn` ()
+
+  describe "$>" $ do
+    it "is the same as flipped <$" $ do
+      (Just 5 :: Maybe Int) $> 6 `shouldBe` (Just 6 :: Maybe Int)
diff --git a/test/Data/IORef/CompatSpec.hs b/test/Data/IORef/CompatSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Data/IORef/CompatSpec.hs
@@ -0,0 +1,22 @@
+module Data.IORef.CompatSpec (main, spec) where
+
+import           Test.Hspec
+
+import           Control.Monad
+import           Data.IORef.Compat
+
+main :: IO ()
+main = hspec spec
+
+spec :: Spec
+spec = do
+  describe "modifyIORef'" $
+    it "mutates the contents of an IORef strictly" $ do
+      ref <- newIORef 0
+      replicateM_ 1000000 $ modifyIORef' ref (+1)
+      readIORef ref `shouldReturn` (1000000 :: Int)
+  describe "atomicModifyIORef'" $
+    it "atomically modifies the contents of an IORef strictly" $ do
+      ref <- newIORef 0
+      replicateM_ 1000000 . atomicModifyIORef' ref $ \n -> (n+1, ())
+      readIORef ref `shouldReturn` (1000000 :: Int)
diff --git a/test/Data/List/CompatSpec.hs b/test/Data/List/CompatSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Data/List/CompatSpec.hs
@@ -0,0 +1,43 @@
+module Data.List.CompatSpec (main, spec) where
+
+import           Test.Hspec
+import           Data.List.Compat
+
+data Asymmetric = A | B deriving Show
+
+instance Eq Asymmetric where
+  A == _ = True
+  B == _ = False
+
+main :: IO ()
+main = hspec spec
+
+spec :: Spec
+spec = do
+  describe "dropWhileEnd" $ do
+    it "drops the largest suffix of a list in which a predicate holds for all elements" $ do
+      dropWhileEnd (== ' ') "foo "    `shouldBe` "foo"
+      dropWhileEnd (== ' ') "foo bar" `shouldBe` "foo bar"
+  describe "isSubsequenceOf" $ do
+    it "returns True if the first list is a subsequence of the second list" $ do
+      isSubsequenceOf "GHC" "The Glorious Haskell Compiler" `shouldBe` True
+      isSubsequenceOf "JHC" "The Glorious Haskell Compiler" `shouldBe` False
+  describe "nub" $
+    it "preserves the order of arguments to (==)" $
+      nub [A, B] `shouldBe` [A]
+  describe "nubBy" $
+    it "preserves the order of arguments to the equality function" $
+      nubBy (<) "12" `shouldBe` "1"
+  describe "sortOn" $ do
+    it "sorts a list by comparing the results of a key function applied to each element" $ do
+      sortOn (>='b') "cba" `shouldBe` "acb"
+  describe "uncons" $ do
+    it "decomposes a list into its head and tail" $ do
+      uncons ""   `shouldBe` Nothing
+      uncons "12" `shouldBe` Just ('1', "2")
+  describe "union" $
+    it "nubs arguments in the same order as (==)" $ do
+      union [A] [A, B] `shouldBe` [A]
+  describe "unionBy" $
+    it "nubs arguments in the same order as nubBy's equality function" $ do
+      unionBy (<) "1" "21" `shouldBe` "11"
diff --git a/test/Data/Monoid/CompatSpec.hs b/test/Data/Monoid/CompatSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Data/Monoid/CompatSpec.hs
@@ -0,0 +1,19 @@
+module Data.Monoid.CompatSpec (main, spec) where
+
+import           Test.Hspec
+import           Test.QuickCheck
+
+import           Data.Monoid.Compat
+
+import           Prelude ()
+import           Prelude.Compat (IO, String, ($))
+
+main :: IO ()
+main = hspec spec
+
+spec :: Spec
+spec = do
+  describe "<>" $ do
+    it "is an infix synonym for mappend" $ do
+      property $ \xs ys -> do
+        xs <> ys `shouldBe` (mappend xs ys :: String)
diff --git a/test/Data/STRef/CompatSpec.hs b/test/Data/STRef/CompatSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Data/STRef/CompatSpec.hs
@@ -0,0 +1,19 @@
+module Data.STRef.CompatSpec (main, spec) where
+
+import           Test.Hspec
+
+import           Control.Monad
+import           Control.Monad.ST
+import           Data.STRef.Compat
+
+main :: IO ()
+main = hspec spec
+
+spec :: Spec
+spec =
+  describe "modifySTRef'" $
+    it "should mutate the contents of an STRef strictly" $
+      shouldBe (1000000 :: Int) $ runST $ do
+        ref <- newSTRef 0
+        replicateM_ 1000000 $ modifySTRef' ref (+1)
+        readSTRef ref
diff --git a/test/Data/Version/CompatSpec.hs b/test/Data/Version/CompatSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Data/Version/CompatSpec.hs
@@ -0,0 +1,10 @@
+module Data.Version.CompatSpec (spec) where
+
+import           Test.Hspec
+import           Data.Version.Compat
+
+spec :: Spec
+spec = do
+  describe "makeVersion" $
+    it "constructs a tagless Version" $
+      makeVersion [1,2,3] `shouldBe` Version [1,2,3] []
diff --git a/test/Data/Word/CompatSpec.hs b/test/Data/Word/CompatSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Data/Word/CompatSpec.hs
@@ -0,0 +1,22 @@
+module Data.Word.CompatSpec (main, spec) where
+
+import Test.Hspec
+import Data.Word.Compat
+
+main :: IO ()
+main = hspec spec
+
+spec :: Spec
+spec = do
+  describe "byteSwap16" $
+    it "reverses the order of bytes in a Word16 value" $ do
+      byteSwap16 0x1100 `shouldBe` 0x0011
+      byteSwap16 0x1010 `shouldBe` 0x1010
+  describe "byteSwap32" $
+    it "reverses the order of bytes in a Word32 value" $ do
+      byteSwap32 0x11001010 `shouldBe` 0x10100011
+      byteSwap32 0x10101111 `shouldBe` 0x11111010
+  describe "byteSwap64" $
+    it "reverses the order of bytes in a Word64 value" $ do
+      byteSwap64 0x1010111110101111 `shouldBe` 0x1111101011111010
+      byteSwap64 0x1100000000000011 `shouldBe` 0x1100000000000011
diff --git a/test/Foreign/Marshal/Alloc/CompatSpec.hs b/test/Foreign/Marshal/Alloc/CompatSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Foreign/Marshal/Alloc/CompatSpec.hs
@@ -0,0 +1,17 @@
+module Foreign.Marshal.Alloc.CompatSpec (main, spec) where
+
+import           Test.Hspec
+
+import           Control.Exception
+import           Foreign.Marshal.Alloc.Compat
+import           Foreign.Storable
+
+main :: IO ()
+main = hspec spec
+
+spec :: Spec
+spec = do
+  describe "calloc" $
+    it "allocates memory with bytes of value zero" $ do
+      bracket calloc free $ \ptr -> do
+        peek ptr `shouldReturn` (0 :: Int)
diff --git a/test/Foreign/Marshal/Utils/CompatSpec.hs b/test/Foreign/Marshal/Utils/CompatSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Foreign/Marshal/Utils/CompatSpec.hs
@@ -0,0 +1,20 @@
+module Foreign.Marshal.Utils.CompatSpec (main, spec) where
+
+import Test.Hspec
+
+import Foreign.Marshal.Alloc
+import Foreign.Marshal.Utils.Compat
+import Foreign.Ptr
+import Foreign.Storable
+
+main :: IO ()
+main = hspec spec
+
+spec :: Spec
+spec = do
+  describe "fillBytes" $
+    it "fills a given number of bytes in memory area with a byte value" $ do
+      alloca $ \ptr -> do
+        let _ = ptr :: Ptr Int
+        fillBytes ptr 0 $ sizeOf ptr
+        peek ptr `shouldReturn` 0
diff --git a/test/Numeric/CompatSpec.hs b/test/Numeric/CompatSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Numeric/CompatSpec.hs
@@ -0,0 +1,24 @@
+module Numeric.CompatSpec (main, spec) where
+
+import Test.Hspec
+import Numeric.Compat
+
+main :: IO ()
+main = hspec spec
+
+spec :: Spec
+spec = do
+  describe "showFFloatAlt" $ do
+    it "shows a RealFloat value, always using decimal notation" $
+      showFFloatAlt Nothing  (12 :: Double) "" `shouldBe` "12.0"
+    it "allows to specify the number of decimal places" $
+      showFFloatAlt (Just 4) (12 :: Double) "" `shouldBe` "12.0000"
+  describe "showGFloatAlt" $ do
+    it "shows a RealFloat value, using decimal notation if the absolute value lies between 0.1 and 9,999,999" $
+      showGFloatAlt Nothing  (12 :: Double) ""         `shouldBe` "12.0"
+    it "shows a RealFloat value, using decimal notation and specifying the number of decimal places" $
+      showGFloatAlt (Just 4) (12 :: Double) ""         `shouldBe` "12.0000"
+    it "shows a RealFloat value, using scientific notation if the absolute value falls outside of the range" $
+      showGFloatAlt Nothing  (1234567890 :: Double) "" `shouldBe` "1.23456789e9"
+    it "shows a RealFloat value, using scientific notation and specifying the number of decimal places" $
+      showGFloatAlt (Just 4) (1234567890 :: Double) "" `shouldBe` "1.2346e9"
diff --git a/test/Spec.hs b/test/Spec.hs
new file mode 100644
--- /dev/null
+++ b/test/Spec.hs
@@ -0,0 +1,1 @@
+{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
diff --git a/test/System/Environment/CompatSpec.hs b/test/System/Environment/CompatSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/System/Environment/CompatSpec.hs
@@ -0,0 +1,126 @@
+{-# LANGUAGE CPP #-}
+module System.Environment.CompatSpec (main, spec) where
+
+import           Test.Hspec
+#if __GLASGOW_HASKELL__ >= 702
+import           Test.QuickCheck
+#endif
+
+import qualified Control.Exception as E
+import           GHC.IO.Exception (IOErrorType (InvalidArgument))
+import           System.Environment.Compat
+import           System.IO.Error
+
+main :: IO ()
+main = hspec spec
+
+withEnv :: String -> String -> IO a -> IO a
+withEnv k v action = E.bracket save restore $ \_ -> do
+  setEnv k v >> action
+  where
+    save    = lookupEnv k
+    restore = maybe (unsetEnv k) (setEnv k)
+
+withoutEnv :: String -> IO a -> IO a
+withoutEnv k action = E.bracket save restore $ \_ -> do
+  unsetEnv k >> action
+  where
+    save    = lookupEnv k
+    restore = maybe (unsetEnv k) (setEnv k)
+
+spec :: Spec
+spec = do
+  describe "lookupEnv" $ do
+    it "returns specified environment variable" $ do
+      withEnv "FOOBAR" "23" $ do
+        lookupEnv "FOOBAR" `shouldReturn` Just "23"
+
+    it "returns Nothing if specified environment variable is not set" $ do
+      withoutEnv "FOOBAR" $ do
+        lookupEnv "FOOBAR" `shouldReturn` Nothing
+
+  describe "unsetEnv" $ do
+    it "removes specified environment variable" $ do
+      setEnv "FOO" "foo"
+      unsetEnv "FOO"
+      getEnv "FOO" `shouldThrow` isDoesNotExistError
+
+    it "does nothing if specified environment variable is not set" $ do
+      unsetEnv "BAR"
+      unsetEnv "BAR"
+      getEnv "BAR" `shouldThrow` isDoesNotExistError
+
+    it "throws an exception if key is the empty string" $ do
+      unsetEnv "" `shouldThrow` (== InvalidArgument) . ioeGetErrorType
+
+    it "throws an exception if key contains '='" $ do
+      unsetEnv "some=key" `shouldThrow` (== InvalidArgument) . ioeGetErrorType
+
+#if __GLASGOW_HASKELL__ >= 702
+    it "works for arbitrary keys" $
+      property $ \k -> ('\NUL' `notElem` k && '=' `notElem` k && (not . null) k) ==> do
+        setEnv k "foo"
+        unsetEnv k
+        getEnv k `shouldThrow` isDoesNotExistError
+#endif
+
+  describe "setEnv" $ do
+    it "sets specified environment variable to given value" $ do
+      unsetEnv "FOO"
+      setEnv "FOO" "foo"
+      getEnv "FOO" `shouldReturn` "foo"
+
+    it "resets specified environment variable, if it is already set" $ do
+      unsetEnv "FOO"
+      setEnv "FOO" "foo"
+      setEnv "FOO" "bar"
+      getEnv "FOO" `shouldReturn` "bar"
+
+    it "removes specified environment variable when value is the empty string" $ do
+      setEnv "FOO" "foo"
+      setEnv "FOO" ""
+      getEnv "FOO" `shouldThrow` isDoesNotExistError
+
+    it "removes specified environment variable when first character of value is NUL" $ do
+      setEnv "FOO" "foo"
+      setEnv "FOO" "\NULfoo"
+      getEnv "FOO" `shouldThrow` isDoesNotExistError
+
+    it "truncates value at NUL character" $ do
+      unsetEnv "FOO"
+      setEnv "FOO" "foo\NULbar"
+      getEnv "FOO" `shouldReturn` "foo"
+
+    it "truncates key at NUL character" $ do
+      unsetEnv "FOO"
+      setEnv "FOO\NULBAR" "foo"
+      getEnv "FOO" `shouldReturn` "foo"
+
+#if __GLASGOW_HASKELL__ >= 702
+    it "works for unicode" $ do
+      unsetEnv "FOO"
+      setEnv "FOO" "foo-\955-bar"
+      getEnv "FOO" `shouldReturn` "foo-\955-bar"
+
+    it "works for arbitrary values" $
+      property $ \v -> ('\NUL' `notElem` v && (not . null) v) ==> do
+        setEnv "FOO" v
+        getEnv "FOO" `shouldReturn` v
+#endif
+
+    it "works for unicode keys" $ do
+      setEnv "foo-\955-bar" "foo"
+      getEnv "foo-\955-bar" `shouldReturn` "foo"
+
+    it "throws an exception if key is the empty string" $ do
+      setEnv "" "foo" `shouldThrow` (== InvalidArgument) . ioeGetErrorType
+
+    it "throws an exception if key contains '='" $ do
+      setEnv "some=key" "foo" `shouldThrow` (== InvalidArgument) . ioeGetErrorType
+
+#if __GLASGOW_HASKELL__ >= 702
+    it "works for arbitrary keys" $
+      property $ \k -> ('\NUL' `notElem` k && '=' `notElem` k && (not . null) k) ==> do
+        setEnv k "foo"
+        getEnv k `shouldReturn` "foo"
+#endif
diff --git a/test/Text/Read/CompatSpec.hs b/test/Text/Read/CompatSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Text/Read/CompatSpec.hs
@@ -0,0 +1,24 @@
+module Text.Read.CompatSpec (main, spec) where
+
+import           Test.Hspec
+
+import           Text.Read.Compat
+
+main :: IO ()
+main = hspec spec
+
+spec :: Spec
+spec = do
+  describe "readMaybe" $ do
+    it "parses a value" $ do
+      readMaybe "23" `shouldBe` (Just 23 :: Maybe Int)
+
+    it "returns Nothing if parsing fails" $ do
+      readMaybe "xx" `shouldBe` (Nothing :: Maybe Int)
+
+  describe "readEither" $ do
+    it "parses a value" $ do
+      readEither "23" `shouldBe` (Right 23 :: Either String Int)
+
+    it "returns Left if parsing fails" $ do
+      readEither "xx" `shouldBe` (Left "Prelude.read: no parse" :: Either String Int)
