diff --git a/CHANGES.markdown b/CHANGES.markdown
--- a/CHANGES.markdown
+++ b/CHANGES.markdown
@@ -1,3 +1,37 @@
+## Changes in 0.10.0 [2018.04.05]
+ - Sync with `base-4.11`/GHC 8.4
+ - Backport `Semigroup((<>))` to `Prelude.Compat`.
+
+   Note that the `Semigroup` class has only been in `base` since
+   `base-4.9`/GHC 8.0, so accordingly, this can only be backported back
+   to GHC 8.0. If you wish to have a version of `Prelude.Compat` that backports
+   `Semigroup` to older GHCs (by conditionally depending on the `semigroups`
+   library), use the `Prelude.Compat` module from the `base-compat-batteries`
+   package.
+ - Backport `(<&>)` to `Data.Functor.Compat`
+ - Backport `iterate'` to `Data.List.Compat`
+ - Backport `showHFloat` to `Numeric.Compat`
+ - Backport a `RuntimeRep`-polymorphic `withTypeable` function to
+   `Type.Reflection.Compat`. (This is only exported on `base-4.10`/GHC 8.2.)
+ - Introduce the following modules, back until the oldest version of `base`
+   that can support backporting them. If you wish to use them in conjunction
+   with older versions of `base`, use the `base-compat-batteries` package.
+   - `Control.Monad.Fail.Compat` (back until `base-4.9`/GHC 8.0)
+   - `Control.Monad.IO.Class.Compat` (back until `base-4.9`/GHC 8.0)
+   - `Data.Bifunctor` (back until `base-4.8`/GHC 7.10)
+   - `Data.Bifoldable` and `Data.Bitraversable` (back until `base-4.10`/GHC 8.2)
+   - `Data.Functor.Compose.Compat`, `Data.Functor.Product.Compat`, and
+     `Data.Functor.Sum.Compat` (back until `base-4.9`/GHC 8.0)
+   - `Data.Functor.Identity.Compat` (back until `base-4.8`/GHC 7.10)
+   - `Data.Semigroup.Compat` (back until `base-4.9`/GHC 8.0)
+   - `Data.Void.Compat` (back until `base-4.8`/GHC 7.10)
+   - `Numeric.Natural.Compat` (back until `base-4.8`/GHC 7.10)
+ - Introduce versions of modules with the suffix `.Repl`. These simply reexport
+   the contents of their counterparts without the `.Repl` suffix to provide
+   a globally unique namespace to import from in the event one wants to import
+   `base-compat` modules into GHCi. (In `base-compat-batteries`, the
+   corresponding suffix is `.Repl.Batteries`.)
+
 ## Changes in 0.9.3 [2017.04.10]
  - Sync with `base-4.10`/GHC 8.2
  - Backport `fromLeft`/`fromRight` to `Data.Either.Compat`
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2012-2017 Simon Hengel <sol@typeful.net> and Ryan Scott <ryan.gl.scott@gmail.com>
+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
diff --git a/README.markdown b/README.markdown
--- a/README.markdown
+++ b/README.markdown
@@ -3,7 +3,6 @@
 [![Hackage Dependencies](https://img.shields.io/hackage-deps/v/base-compat.svg)](http://packdeps.haskellers.com/reverse/base-compat)
 [![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]
-[![Build](https://img.shields.io/travis/haskell-compat/base-compat.svg)](https://travis-ci.org/haskell-compat/base-compat)
 
 [Hackage: base-compat]:
   http://hackage.haskell.org/package/base-compat
@@ -34,6 +33,13 @@
 [Data types and type classes](#data-types-and-type-classes)
 section.
 
+`base-compat` is intentionally designed to have zero dependencies. As a
+consequence, there are some modules that can only be backported up to certain
+versions of `base`. If an even wider support window is desired in these
+scenarios, there also exists a `base-compat-batteries` package which augments
+`base-compat` with certain compatibility package dependencies. For more info,
+see the [Dependencies](#dependencies) section.
+
 ## Basic usage
 
 In your cabal file, you should have something like this:
@@ -167,13 +173,13 @@
 ```haskell
 class Bits b => FiniteBits b where
     finiteBitSize :: b -> Int
-    countLeadingZeros :: b -> Int
-    countTrailingZeros :: b -> Int
+    countLeadingZeros :: b -> Int   -- ^ @since 4.8.0.0
+    countTrailingZeros :: b -> Int  -- ^ @since 4.8.0.0
 ```
 
 This raises the question: how can `FiniteBits` be backported consistently
 across all versions of `base`? One approach is to backport the API exposed in
-`base-4.8.0.0` on versions prior to `4.7.0.0`. The problem with this is that
+`base-4.8.0.0` on versions prior to `4.7.0.0`.  The problem with this is that
 `countLeadingZeros` and `countTrailingZeros` are not exposed in `base-4.7.0.0`,
 so instances of `FiniteBits` would have to be declared like this:
 
@@ -186,15 +192,65 @@
 #endif
 ```
 
-This is a very unsatisfactory solution, and for this reason, we do not pursue
-it. For similar reasons, we do not backport data types.
+Another approach is to backport the API from `base-4.7.0.0` and to declare
+additional methods outside of the class:
 
-### Other compatibility packages
+```haskell
+#if MIN_VERSION_base(4,7,0) && !(MIN_VERSION_base(4,8,0))
+countLeadingZeros :: FiniteBits b => b -> Int
+countLeadingZeros = {- default implementation #-}
+#endif
+```
 
-If you _really_ need your favorite data type or type class in `base` to be
-backported, you might be in luck, since several data types have their own
-compatibility packages on Hackage. Here is a list of such packages:
+The situation is only slightly better for classes which exist across all versions of `base`,
+but have grown their API. For example, it's tempting to define
 
+```haskell
+#if !(MIN_VERSION_base(4,8,0))
+displayException :: Exception e => e -> String
+displayException = show
+#endif
+```
+
+As with the previous approach, you won't be able to define new members of the type
+class without CPP guards. In other words, the non-CPP approach would limit
+uses to the lowest common denominator.
+
+As neither approach is a very satisfactory solution, and to embrace
+consistency, we do not pursue either approach. For similar reasons, we do not
+backport data types.
+
+### Dependencies
+
+`base-compat` is designed to have zero dependencies (besides libraries that
+ship with GHC itself). A consequence of this choice is that there are certain
+modules that have a "limited" support window. An important example of this is
+`Prelude.Compat`, which backports the `Semigroup` class to versions of `base`
+older than 4.11 (when it was added to the `Prelude`). Because `Semigroup` was
+not added to `base` until `base-4.9`, `base-compat` cannot backport it to
+any earlier version of `base` than this.
+
+If you would instead desire to be able to use a version of `Prelude.Compat`
+that _does_ backport `Semigroup` to even older versions of `base`, even if it
+means pulling in other dependencies, then you are in luck. There also exists
+a `base-compat-batteries` package, which exposes a strict superset of the API
+in `base-compat`. `base-compat-batteries` has all the same modules as
+`base-compat`, but exposes more functionality on more versions of `base` by
+reexporting things from compatibility libraries whenever necessary. (For
+instance, `base-compat-batteries` exports the `Semigroup` class from the
+`semigroups` library when built against versions of `base` older than 4.9.)
+
+Because `base-compat` and `base-compat-batteries` have the same module names,
+they are quite easy to switch out for one another in library projects, at the
+expense of having clashing names if one tries to import them in GHCi. To
+work around this issue, `base-compat` and `base-compat-batteries` also provide
+copies of each module with the suffix `.Repl` (for `base-compat`) and
+`.Repl.Batteries` (for `base-compat-batteries`) to give them globally unique
+namespaces in the event one wants to import them into GHCi.
+
+Here is a list of compatibility libraries that `base-compat-batteries` depends
+on, paired with the things that each library backports:
+
 * [`bifunctors`](http://hackage.haskell.org/package/bifunctors)
   for:
   * The [`Bifunctor`](http://hackage.haskell.org/package/base-4.8.0.0/docs/Data-Bifunctor.html#t:Bifunctor)
@@ -205,9 +261,6 @@
 * [`fail`](http://hackage.haskell.org/package/fail)
   for the [`MonadFail`](http://hackage.haskell.org/package/base-4.9.0.0/docs/Control-Monad-Fail.html#t:MonadFail)
   type class, introduced in `base-4.9.0.0`
-* [`generic-deriving`](http://hackage.haskell.org/package/generic-deriving)
-  for everything in the [`GHC.Generics`](http://hackage.haskell.org/package/base-4.8.0.0/docs/GHC-Generics.html)
-  module, introduced to `ghc-prim` in GHC 7.2 (and later moved to `base-4.6.0.0`)
 * [`nats`](http://hackage.haskell.org/package/nats)
   for the [`Natural`](http://hackage.haskell.org/package/base-4.8.0.0/docs/Numeric-Natural.html)
   data type, introduced in `base-4.8.0.0`
@@ -231,17 +284,8 @@
   for:
   * The [`Identity`](http://hackage.haskell.org/package/base-4.8.0.0/docs/Data-Functor-Identity.html#t:Identity)
     data type, introduced in `base-4.8.0.0`
-  * The [`MonadIO`](http://hackage.haskell.org/package/base-4.9.0.0/docs/Control-Monad-IO-Class.html#t:MonadIO),
-    [`Eq1`](http://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Functor-Classes.html#t:Eq1),
-    [`Eq2`](http://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Functor-Classes.html#t:Eq2),
-    [`Ord1`](http://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Functor-Classes.html#t:Ord1),
-    [`Ord2`](http://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Functor-Classes.html#t:Ord2),
-    [`Read1`](http://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Functor-Classes.html#t:Read1),
-    [`Read2`](http://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Functor-Classes.html#t:Read2),
-    [`Show1`](http://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Functor-Classes.html#t:Show1),
-    and
-    [`Show2`](http://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Functor-Classes.html#t:Show2)
-    typeclasses; and the
+  * The [`MonadIO`](http://hackage.haskell.org/package/base-4.9.0.0/docs/Control-Monad-IO-Class.html#t:MonadIO)
+    type class; and the
     [`Compose`](http://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Functor-Compose.html#t:Compose),
     [`Product`](http://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Functor-Product.html#t:Product),
     and
@@ -253,6 +297,8 @@
 
 ## Supported versions of GHC/`base`
 
+ * `ghc-8.4.1`  / `base-4.11.0.0`
+ * `ghc-8.2.2`  / `base-4.10.1.0`
  * `ghc-8.2.1`  / `base-4.10.0.0`
  * `ghc-8.0.2`  / `base-4.9.1.0`
  * `ghc-8.0.1`  / `base-4.9.0.0`
diff --git a/base-compat.cabal b/base-compat.cabal
--- a/base-compat.cabal
+++ b/base-compat.cabal
@@ -1,10 +1,10 @@
 name:             base-compat
-version:          0.9.3
+version:          0.10.0
 license:          MIT
 license-file:     LICENSE
-copyright:        (c) 2012-2017 Simon Hengel,
-                  (c) 2014-2017 João Cristóvão,
-                  (c) 2015-2017 Ryan Scott
+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>
@@ -18,9 +18,9 @@
 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.  See the
-                  <https://github.com/haskell-compat/base-compat#readme README>
+                  <https://github.com/haskell-compat/base-compat/blob/master/base-compat/README.markdown README>
                   for what is covered. Also see the
-                  <https://github.com/haskell-compat/base-compat/blob/master/CHANGES.markdown changelog>
+                  <https://github.com/haskell-compat/base-compat/blob/master/base-compat/CHANGES.markdown changelog>
                   for recent changes.
                   .
                   Note that @base-compat@ does not add any orphan instances.
@@ -28,10 +28,21 @@
                   @<http://hackage.haskell.org/package/base-orphans base-orphans>@,
                   for that.
                   .
-                  In addition, `base-compat` does not backport any data types
+                  In addition, @base-compat@ does not backport any data types
                   or type classes. See
-                  @<https://github.com/haskell-compat/base-compat#data-types-and-type-classes this section of the README>@
+                  @<https://github.com/haskell-compat/base-compat/blob/master/base-compat/README.markdown#data-types-and-type-classes this section of the README>@
                   for more info.
+                  .
+                  @base-compat@ is designed to have zero dependencies. For a
+                  version of @base-compat@ that depends on compatibility
+                  libraries for a wider support window, see the
+                  @<http://hackage.haskell.org/package/base-compat-batteries base-compat-batteries>@
+                  package. Most of the modules in this library have the same
+                  names as in @base-compat-batteries@ to make it easier to
+                  switch between the two. There also exist versions of each
+                  module with the suffix @.Repl@, which are distinct from
+                  anything in @base-compat-batteries@, to allow for easier
+                  use in GHCi.
 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
@@ -39,12 +50,14 @@
                   , 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.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
 
 library
   ghc-options:
@@ -63,8 +76,13 @@
       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
@@ -72,16 +90,22 @@
       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
@@ -95,42 +119,64 @@
       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
 
-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
-    , hspec >= 1.8
-    , QuickCheck
+      Control.Concurrent.Compat.Repl
+      Control.Concurrent.MVar.Compat.Repl
+      Control.Monad.Compat.Repl
+      Control.Monad.Fail.Compat.Repl
+      Control.Monad.IO.Class.Compat.Repl
+      Control.Monad.ST.Lazy.Unsafe.Compat.Repl
+      Control.Monad.ST.Unsafe.Compat.Repl
+      Data.Bifoldable.Compat.Repl
+      Data.Bifunctor.Compat.Repl
+      Data.Bitraversable.Compat.Repl
+      Data.Bits.Compat.Repl
+      Data.Bool.Compat.Repl
+      Data.Complex.Compat.Repl
+      Data.Either.Compat.Repl
+      Data.Foldable.Compat.Repl
+      Data.Function.Compat.Repl
+      Data.Functor.Compat.Repl
+      Data.Functor.Compose.Compat.Repl
+      Data.Functor.Const.Compat.Repl
+      Data.Functor.Identity.Compat.Repl
+      Data.Functor.Product.Compat.Repl
+      Data.Functor.Sum.Compat.Repl
+      Data.IORef.Compat.Repl
+      Data.List.Compat.Repl
+      Data.Monoid.Compat.Repl
+      Data.Proxy.Compat.Repl
+      Data.Ratio.Compat.Repl
+      Data.Semigroup.Compat.Repl
+      Data.STRef.Compat.Repl
+      Data.String.Compat.Repl
+      Data.Type.Coercion.Compat.Repl
+      Data.Version.Compat.Repl
+      Data.Void.Compat.Repl
+      Data.Word.Compat.Repl
+      Debug.Trace.Compat.Repl
+      Foreign.Compat.Repl
+      Foreign.ForeignPtr.Compat.Repl
+      Foreign.ForeignPtr.Safe.Compat.Repl
+      Foreign.ForeignPtr.Unsafe.Compat.Repl
+      Foreign.Marshal.Alloc.Compat.Repl
+      Foreign.Marshal.Array.Compat.Repl
+      Foreign.Marshal.Compat.Repl
+      Foreign.Marshal.Safe.Compat.Repl
+      Foreign.Marshal.Unsafe.Compat.Repl
+      Foreign.Marshal.Utils.Compat.Repl
+      Numeric.Compat.Repl
+      Numeric.Natural.Compat.Repl
+      Prelude.Compat.Repl
+      System.Environment.Compat.Repl
+      System.Exit.Compat.Repl
+      System.IO.Unsafe.Compat.Repl
+      Text.Read.Compat.Repl
+      Type.Reflection.Compat.Repl
diff --git a/src/Control/Concurrent/Compat/Repl.hs b/src/Control/Concurrent/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Concurrent/Compat/Repl.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 (
+  module Control.Concurrent.Compat
+) where
+import "this" Control.Concurrent.Compat
diff --git a/src/Control/Concurrent/MVar/Compat/Repl.hs b/src/Control/Concurrent/MVar/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Concurrent/MVar/Compat/Repl.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 (
+  module Control.Concurrent.MVar.Compat
+) where
+import "this" Control.Concurrent.MVar.Compat
diff --git a/src/Control/Monad/Compat/Repl.hs b/src/Control/Monad/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/Compat/Repl.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 (
+  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 #-}
+module Control.Monad.Fail.Compat (
+#if MIN_VERSION_base(4,9,0)
+  module Base
+#endif
+) where
+
+#if MIN_VERSION_base(4,9,0)
+import Control.Monad.Fail as Base
+#endif
diff --git a/src/Control/Monad/Fail/Compat/Repl.hs b/src/Control/Monad/Fail/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/Fail/Compat/Repl.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 (
+  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 #-}
+module Control.Monad.IO.Class.Compat (
+#if MIN_VERSION_base(4,9,0)
+  module Base
+#endif
+) where
+
+#if MIN_VERSION_base(4,9,0)
+import Control.Monad.IO.Class as Base
+#endif
diff --git a/src/Control/Monad/IO/Class/Compat/Repl.hs b/src/Control/Monad/IO/Class/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/IO/Class/Compat/Repl.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 (
+  module Control.Monad.IO.Class.Compat
+) where
+import "this" Control.Monad.IO.Class.Compat
diff --git a/src/Control/Monad/ST/Lazy/Unsafe/Compat/Repl.hs b/src/Control/Monad/ST/Lazy/Unsafe/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/ST/Lazy/Unsafe/Compat/Repl.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 (
+  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/Repl.hs b/src/Control/Monad/ST/Unsafe/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/ST/Unsafe/Compat/Repl.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 (
+  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 #-}
+module Data.Bifoldable.Compat (
+#if MIN_VERSION_base(4,10,0)
+  module Base
+#endif
+) where
+
+#if MIN_VERSION_base(4,10,0)
+import Data.Bifoldable as Base
+#endif
diff --git a/src/Data/Bifoldable/Compat/Repl.hs b/src/Data/Bifoldable/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Bifoldable/Compat/Repl.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 (
+  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 #-}
+module Data.Bifunctor.Compat (
+#if MIN_VERSION_base(4,8,0)
+  module Base
+#endif
+) where
+
+#if MIN_VERSION_base(4,8,0)
+import Data.Bifunctor as Base
+#endif
diff --git a/src/Data/Bifunctor/Compat/Repl.hs b/src/Data/Bifunctor/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Bifunctor/Compat/Repl.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 (
+  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 #-}
+module Data.Bitraversable.Compat (
+#if MIN_VERSION_base(4,10,0)
+  module Base
+#endif
+) where
+
+#if MIN_VERSION_base(4,10,0)
+import Data.Bitraversable as Base
+#endif
diff --git a/src/Data/Bitraversable/Compat/Repl.hs b/src/Data/Bitraversable/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Bitraversable/Compat/Repl.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 (
+  module Data.Bitraversable.Compat
+) where
+import "this" Data.Bitraversable.Compat
diff --git a/src/Data/Bits/Compat/Repl.hs b/src/Data/Bits/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Bits/Compat/Repl.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 (
+  module Data.Bits.Compat
+) where
+import "this" Data.Bits.Compat
diff --git a/src/Data/Bool/Compat/Repl.hs b/src/Data/Bool/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Bool/Compat/Repl.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 (
+  module Data.Bool.Compat
+) where
+import "this" Data.Bool.Compat
diff --git a/src/Data/Complex/Compat/Repl.hs b/src/Data/Complex/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Complex/Compat/Repl.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 (
+  module Data.Complex.Compat
+) where
+import "this" Data.Complex.Compat
diff --git a/src/Data/Either/Compat/Repl.hs b/src/Data/Either/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Either/Compat/Repl.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 (
+  module Data.Either.Compat
+) where
+import "this" Data.Either.Compat
diff --git a/src/Data/Foldable/Compat/Repl.hs b/src/Data/Foldable/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Foldable/Compat/Repl.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 (
+  module Data.Foldable.Compat
+) where
+import "this" Data.Foldable.Compat
diff --git a/src/Data/Function/Compat/Repl.hs b/src/Data/Function/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Function/Compat/Repl.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 (
+  module Data.Function.Compat
+) where
+import "this" Data.Function.Compat
diff --git a/src/Data/Functor/Compat.hs b/src/Data/Functor/Compat.hs
--- a/src/Data/Functor/Compat.hs
+++ b/src/Data/Functor/Compat.hs
@@ -4,13 +4,16 @@
 , 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 '$>'.
@@ -18,5 +21,31 @@
 -- /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.hs b/src/Data/Functor/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Functor/Compat/Repl.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 (
+  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 #-}
+module Data.Functor.Compose.Compat (
+#if MIN_VERSION_base(4,9,0)
+  module Base
+#endif
+) where
+
+#if MIN_VERSION_base(4,9,0)
+import Data.Functor.Compose as Base
+#endif
diff --git a/src/Data/Functor/Compose/Compat/Repl.hs b/src/Data/Functor/Compose/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Functor/Compose/Compat/Repl.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 (
+  module Data.Functor.Compose.Compat
+) where
+import "this" Data.Functor.Compose.Compat
diff --git a/src/Data/Functor/Const/Compat/Repl.hs b/src/Data/Functor/Const/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Functor/Const/Compat/Repl.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 (
+  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 #-}
+module Data.Functor.Identity.Compat (
+#if MIN_VERSION_base(4,8,0)
+  module Base
+#endif
+) where
+
+#if MIN_VERSION_base(4,8,0)
+import Data.Functor.Identity as Base
+#endif
diff --git a/src/Data/Functor/Identity/Compat/Repl.hs b/src/Data/Functor/Identity/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Functor/Identity/Compat/Repl.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 (
+  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 #-}
+module Data.Functor.Product.Compat (
+#if MIN_VERSION_base(4,9,0)
+  module Base
+#endif
+) where
+
+#if MIN_VERSION_base(4,9,0)
+import Data.Functor.Product as Base
+#endif
diff --git a/src/Data/Functor/Product/Compat/Repl.hs b/src/Data/Functor/Product/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Functor/Product/Compat/Repl.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 (
+  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 #-}
+module Data.Functor.Sum.Compat (
+#if MIN_VERSION_base(4,9,0)
+  module Base
+#endif
+) where
+
+#if MIN_VERSION_base(4,9,0)
+import Data.Functor.Sum as Base
+#endif
diff --git a/src/Data/Functor/Sum/Compat/Repl.hs b/src/Data/Functor/Sum/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Functor/Sum/Compat/Repl.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 (
+  module Data.Functor.Sum.Compat
+) where
+import "this" Data.Functor.Sum.Compat
diff --git a/src/Data/IORef/Compat/Repl.hs b/src/Data/IORef/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/IORef/Compat/Repl.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 (
+  module Data.IORef.Compat
+) where
+import "this" Data.IORef.Compat
diff --git a/src/Data/List/Compat.hs b/src/Data/List/Compat.hs
--- a/src/Data/List/Compat.hs
+++ b/src/Data/List/Compat.hs
@@ -2,6 +2,10 @@
 {-# LANGUAGE BangPatterns #-}
 module Data.List.Compat (
   module Base
+#if !(MIN_VERSION_base(4,11,0))
+, iterate'
+#endif
+
 #if !(MIN_VERSION_base(4,8,0))
 , all
 , and
@@ -78,10 +82,14 @@
   )
 import Data.Foldable.Compat
 import Data.Traversable
-import Prelude.Compat hiding (foldr, null)
 import Data.Ord (comparing)
 #endif
 
+#if !(MIN_VERSION_base(4,11,0))
+import GHC.Exts (build)
+import Prelude.Compat hiding (foldr, null)
+#endif
+
 #if !(MIN_VERSION_base(4,5,0))
 -- | The 'dropWhileEnd' function drops the largest suffix of a list
 -- in which the given predicate holds for all elements.  For example:
@@ -199,4 +207,28 @@
 -- | The 'unionBy' function is the non-overloaded version of 'union'.
 unionBy                 :: (a -> a -> Bool) -> [a] -> [a] -> [a]
 unionBy eq xs ys        =  xs ++ foldl (flip (deleteBy eq)) (nubBy eq ys) xs
+#endif
+
+#if !(MIN_VERSION_base(4,11,0))
+-- | 'iterate\'' is the strict version of 'iterate'.
+--
+-- It ensures that the result of each application of force to weak head normal
+-- form before proceeding.
+{-# NOINLINE [1] iterate' #-}
+iterate' :: (a -> a) -> a -> [a]
+iterate' f x =
+    let x' = f x
+    in x' `seq` (x : iterate' f x')
+
+{-# INLINE [0] iterate'FB #-} -- See Note [Inline FB functions]
+iterate'FB :: (a -> b -> b) -> (a -> a) -> a -> b
+iterate'FB c f x0 = go x0
+  where go x =
+            let x' = f x
+            in x' `seq` (x `c` go x')
+
+{-# RULES
+"iterate'"    [~1] forall f x.   iterate' f x = build (\c _n -> iterate'FB c f x)
+"iterate'FB"  [1]                iterate'FB (:) = iterate'
+ #-}
 #endif
diff --git a/src/Data/List/Compat/Repl.hs b/src/Data/List/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/List/Compat/Repl.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 (
+  module Data.List.Compat
+) where
+import "this" Data.List.Compat
diff --git a/src/Data/Monoid/Compat/Repl.hs b/src/Data/Monoid/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Monoid/Compat/Repl.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 (
+  module Data.Monoid.Compat
+) where
+import "this" Data.Monoid.Compat
diff --git a/src/Data/Proxy/Compat/Repl.hs b/src/Data/Proxy/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Proxy/Compat/Repl.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 (
+  module Data.Proxy.Compat
+) where
+import "this" Data.Proxy.Compat
diff --git a/src/Data/Ratio/Compat/Repl.hs b/src/Data/Ratio/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Ratio/Compat/Repl.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 (
+  module Data.Ratio.Compat
+) where
+import "this" Data.Ratio.Compat
diff --git a/src/Data/STRef/Compat/Repl.hs b/src/Data/STRef/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/STRef/Compat/Repl.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 (
+  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,39 @@
+{-# LANGUAGE CPP, NoImplicitPrelude #-}
+-- | This backports the modern "Data.Semigroup" interface back to
+-- @base-4.9@/GHC 8.0.
+module Data.Semigroup.Compat (
+#if MIN_VERSION_base(4,9,0)
+    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
+#endif
+  ) where
+
+#if MIN_VERSION_base(4,9,0)
+import Data.Semigroup
+#endif
diff --git a/src/Data/Semigroup/Compat/Repl.hs b/src/Data/Semigroup/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Semigroup/Compat/Repl.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 (
+  module Data.Semigroup.Compat
+) where
+import "this" Data.Semigroup.Compat
diff --git a/src/Data/String/Compat/Repl.hs b/src/Data/String/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/String/Compat/Repl.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 (
+  module Data.String.Compat
+) where
+import "this" Data.String.Compat
diff --git a/src/Data/Type/Coercion/Compat/Repl.hs b/src/Data/Type/Coercion/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Type/Coercion/Compat/Repl.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 (
+  module Data.Type.Coercion.Compat
+) where
+import "this" Data.Type.Coercion.Compat
diff --git a/src/Data/Version/Compat/Repl.hs b/src/Data/Version/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Version/Compat/Repl.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 (
+  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,10 @@
+{-# LANGUAGE CPP, NoImplicitPrelude #-}
+module Data.Void.Compat (
+#if MIN_VERSION_base(4,8,0)
+  module Base
+#endif
+) where
+
+#if MIN_VERSION_base(4,8,0)
+import Data.Void as Base
+#endif
diff --git a/src/Data/Void/Compat/Repl.hs b/src/Data/Void/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Void/Compat/Repl.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 (
+  module Data.Void.Compat
+) where
+import "this" Data.Void.Compat
diff --git a/src/Data/Word/Compat/Repl.hs b/src/Data/Word/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Word/Compat/Repl.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 (
+  module Data.Word.Compat
+) where
+import "this" Data.Word.Compat
diff --git a/src/Debug/Trace/Compat/Repl.hs b/src/Debug/Trace/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Debug/Trace/Compat/Repl.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 (
+  module Debug.Trace.Compat
+) where
+import "this" Debug.Trace.Compat
diff --git a/src/Foreign/Compat/Repl.hs b/src/Foreign/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Compat/Repl.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 (
+  module Foreign.Compat
+) where
+import "this" Foreign.Compat
diff --git a/src/Foreign/ForeignPtr/Compat/Repl.hs b/src/Foreign/ForeignPtr/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/ForeignPtr/Compat/Repl.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 (
+  module Foreign.ForeignPtr.Compat
+) where
+import "this" Foreign.ForeignPtr.Compat
diff --git a/src/Foreign/ForeignPtr/Safe/Compat/Repl.hs b/src/Foreign/ForeignPtr/Safe/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/ForeignPtr/Safe/Compat/Repl.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 (
+  module Foreign.ForeignPtr.Safe.Compat
+) where
+import "this" Foreign.ForeignPtr.Safe.Compat
diff --git a/src/Foreign/ForeignPtr/Unsafe/Compat/Repl.hs b/src/Foreign/ForeignPtr/Unsafe/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/ForeignPtr/Unsafe/Compat/Repl.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 (
+  module Foreign.ForeignPtr.Unsafe.Compat
+) where
+import "this" Foreign.ForeignPtr.Unsafe.Compat
diff --git a/src/Foreign/Marshal/Alloc/Compat/Repl.hs b/src/Foreign/Marshal/Alloc/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Marshal/Alloc/Compat/Repl.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 (
+  module Foreign.Marshal.Alloc.Compat
+) where
+import "this" Foreign.Marshal.Alloc.Compat
diff --git a/src/Foreign/Marshal/Array/Compat/Repl.hs b/src/Foreign/Marshal/Array/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Marshal/Array/Compat/Repl.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 (
+  module Foreign.Marshal.Array.Compat
+) where
+import "this" Foreign.Marshal.Array.Compat
diff --git a/src/Foreign/Marshal/Compat/Repl.hs b/src/Foreign/Marshal/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Marshal/Compat/Repl.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 (
+  module Foreign.Marshal.Compat
+) where
+import "this" Foreign.Marshal.Compat
diff --git a/src/Foreign/Marshal/Safe/Compat/Repl.hs b/src/Foreign/Marshal/Safe/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Marshal/Safe/Compat/Repl.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 (
+  module Foreign.Marshal.Safe.Compat
+) where
+import "this" Foreign.Marshal.Safe.Compat
diff --git a/src/Foreign/Marshal/Unsafe/Compat/Repl.hs b/src/Foreign/Marshal/Unsafe/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Marshal/Unsafe/Compat/Repl.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 (
+  module Foreign.Marshal.Unsafe.Compat
+) where
+import "this" Foreign.Marshal.Unsafe.Compat
diff --git a/src/Foreign/Marshal/Utils/Compat/Repl.hs b/src/Foreign/Marshal/Utils/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Foreign/Marshal/Utils/Compat/Repl.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 (
+  module Foreign.Marshal.Utils.Compat
+) where
+import "this" Foreign.Marshal.Utils.Compat
diff --git a/src/Numeric/Compat.hs b/src/Numeric/Compat.hs
--- a/src/Numeric/Compat.hs
+++ b/src/Numeric/Compat.hs
@@ -3,6 +3,7 @@
   module Base
 , showFFloatAlt
 , showGFloatAlt
+, showHFloat
 ) where
 
 import Numeric as Base
@@ -10,8 +11,13 @@
 #if !(MIN_VERSION_base(4,7,0))
 import Data.Char (intToDigit)
 import GHC.Float
+#endif
+
+#if !(MIN_VERSION_base(4,11,0))
 import Prelude
+#endif
 
+#if !(MIN_VERSION_base(4,7,0))
 -- | Show a signed 'RealFloat' value
 -- using standard decimal notation (e.g. @245000@, @0.0015@).
 --
@@ -96,4 +102,52 @@
           d:ds' = map intToDigit (if ei > 0 then is' else 0:is')
          in
          d : (if null ds' && not alt then "" else '.':ds')
+#endif
+
+#if !(MIN_VERSION_base(4,11,0))
+{- | Show a floating-point value in the hexadecimal format,
+similar to the @%a@ specifier in C's printf.
+
+  >>> showHFloat (212.21 :: Double) ""
+  "0x1.a86b851eb851fp7"
+  >>> showHFloat (-12.76 :: Float) ""
+  "-0x1.9851ecp3"
+  >>> showHFloat (-0 :: Double) ""
+  "-0x0p+0"
+-}
+showHFloat :: RealFloat a => a -> ShowS
+showHFloat = showString . fmt
+  where
+  fmt x
+    | isNaN x                   = "NaN"
+    | isInfinite x              = (if x < 0 then "-" else "") ++ "Infinity"
+    | x < 0 || isNegativeZero x = '-' : cvt (-x)
+    | otherwise                 = cvt x
+
+  cvt x
+    | x == 0 = "0x0p+0"
+    | otherwise =
+      case floatToDigits 2 x of
+        r@([], _) -> error $ "Impossible happened: showHFloat: " ++ show r
+        (d:ds, e) -> "0x" ++ show d ++ frac ds ++ "p" ++ show (e-1)
+
+  -- Given binary digits, convert them to hex in blocks of 4
+  -- Special case: If all 0's, just drop it.
+  frac digits
+    | allZ digits = ""
+    | otherwise   = "." ++ hex digits
+    where
+    hex ds =
+      case ds of
+        []                -> ""
+        [a]               -> hexDigit a 0 0 0 ""
+        [a,b]             -> hexDigit a b 0 0 ""
+        [a,b,c]           -> hexDigit a b c 0 ""
+        a : b : c : d : r -> hexDigit a b c d (hex r)
+
+  hexDigit a b c d = showHex (8*a + 4*b + 2*c + d)
+
+  allZ xs = case xs of
+              x : more -> x == 0 && allZ more
+              []       -> True
 #endif
diff --git a/src/Numeric/Compat/Repl.hs b/src/Numeric/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Numeric/Compat/Repl.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 (
+  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 #-}
+module Numeric.Natural.Compat (
+#if MIN_VERSION_base(4,8,0)
+  module Base
+#endif
+) where
+
+#if MIN_VERSION_base(4,8,0)
+import Numeric.Natural as Base
+#endif
diff --git a/src/Numeric/Natural/Compat/Repl.hs b/src/Numeric/Natural/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Numeric/Natural/Compat/Repl.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 (
+  module Numeric.Natural.Compat
+) where
+import "this" Numeric.Natural.Compat
diff --git a/src/Prelude/Compat.hs b/src/Prelude/Compat.hs
--- a/src/Prelude/Compat.hs
+++ b/src/Prelude/Compat.hs
@@ -1,6 +1,6 @@
 {-# LANGUAGE CPP, NoImplicitPrelude #-}
 module Prelude.Compat (
-#if MIN_VERSION_base(4,9,0)
+#if MIN_VERSION_base(4,11,0)
   module Base
 #else
   either
@@ -134,6 +134,9 @@
 , mappend
 , mconcat
 , mempty
+# if MIN_VERSION_base(4,9,0)
+, (<>)
+# endif
 , maxBound
 , minBound
 , enumFrom
@@ -231,6 +234,9 @@
 , Real
 , RealFloat
 , RealFrac
+# if MIN_VERSION_base(4,9,0)
+, Semigroup
+# endif
 , Show
 , Traversable
 
@@ -299,6 +305,10 @@
 import Data.Monoid
 import Data.Word
 # endif
+#endif
+
+#if MIN_VERSION_base(4,9,0) && !(MIN_VERSION_base(4,11,0))
+import Data.Semigroup as Base (Semigroup((<>)))
 #endif
 
 #if !(MIN_VERSION_base(4,9,0))
diff --git a/src/Prelude/Compat/Repl.hs b/src/Prelude/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Prelude/Compat/Repl.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 (
+  module Prelude.Compat
+) where
+import "this" Prelude.Compat
diff --git a/src/System/Environment/Compat/Repl.hs b/src/System/Environment/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/System/Environment/Compat/Repl.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 (
+  module System.Environment.Compat
+) where
+import "this" System.Environment.Compat
diff --git a/src/System/Exit/Compat/Repl.hs b/src/System/Exit/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/System/Exit/Compat/Repl.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 (
+  module System.Exit.Compat
+) where
+import "this" System.Exit.Compat
diff --git a/src/System/IO/Unsafe/Compat/Repl.hs b/src/System/IO/Unsafe/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/System/IO/Unsafe/Compat/Repl.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 (
+  module System.IO.Unsafe.Compat
+) where
+import "this" System.IO.Unsafe.Compat
diff --git a/src/Text/Read/Compat/Repl.hs b/src/Text/Read/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Read/Compat/Repl.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 (
+  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.hs b/src/Type/Reflection/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Type/Reflection/Compat/Repl.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 (
+  module Type.Reflection.Compat
+) where
+import "this" Type.Reflection.Compat
diff --git a/test/Control/Monad/CompatSpec.hs b/test/Control/Monad/CompatSpec.hs
deleted file mode 100644
--- a/test/Control/Monad/CompatSpec.hs
+++ /dev/null
@@ -1,16 +0,0 @@
-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
deleted file mode 100644
--- a/test/Data/Bits/CompatSpec.hs
+++ /dev/null
@@ -1,34 +0,0 @@
-{-# 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
deleted file mode 100644
--- a/test/Data/Bool/CompatSpec.hs
+++ /dev/null
@@ -1,18 +0,0 @@
-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
deleted file mode 100644
--- a/test/Data/Either/CompatSpec.hs
+++ /dev/null
@@ -1,25 +0,0 @@
-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
deleted file mode 100644
--- a/test/Data/Foldable/CompatSpec.hs
+++ /dev/null
@@ -1,13 +0,0 @@
-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
deleted file mode 100644
--- a/test/Data/Function/CompatSpec.hs
+++ /dev/null
@@ -1,13 +0,0 @@
-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
deleted file mode 100644
--- a/test/Data/Functor/CompatSpec.hs
+++ /dev/null
@@ -1,17 +0,0 @@
-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
deleted file mode 100644
--- a/test/Data/IORef/CompatSpec.hs
+++ /dev/null
@@ -1,22 +0,0 @@
-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
deleted file mode 100644
--- a/test/Data/List/CompatSpec.hs
+++ /dev/null
@@ -1,43 +0,0 @@
-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
deleted file mode 100644
--- a/test/Data/Monoid/CompatSpec.hs
+++ /dev/null
@@ -1,16 +0,0 @@
-module Data.Monoid.CompatSpec (main, spec) where
-
-import           Test.Hspec
-import           Test.QuickCheck
-
-import           Data.Monoid.Compat
-
-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
deleted file mode 100644
--- a/test/Data/STRef/CompatSpec.hs
+++ /dev/null
@@ -1,19 +0,0 @@
-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
deleted file mode 100644
--- a/test/Data/Version/CompatSpec.hs
+++ /dev/null
@@ -1,10 +0,0 @@
-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
deleted file mode 100644
--- a/test/Data/Word/CompatSpec.hs
+++ /dev/null
@@ -1,22 +0,0 @@
-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
deleted file mode 100644
--- a/test/Foreign/Marshal/Alloc/CompatSpec.hs
+++ /dev/null
@@ -1,17 +0,0 @@
-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
deleted file mode 100644
--- a/test/Foreign/Marshal/Utils/CompatSpec.hs
+++ /dev/null
@@ -1,20 +0,0 @@
-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
deleted file mode 100644
--- a/test/Numeric/CompatSpec.hs
+++ /dev/null
@@ -1,24 +0,0 @@
-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
deleted file mode 100644
--- a/test/Spec.hs
+++ /dev/null
@@ -1,1 +0,0 @@
-{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
diff --git a/test/System/Environment/CompatSpec.hs b/test/System/Environment/CompatSpec.hs
deleted file mode 100644
--- a/test/System/Environment/CompatSpec.hs
+++ /dev/null
@@ -1,120 +0,0 @@
-{-# LANGUAGE CPP #-}
-module System.Environment.CompatSpec (main, spec) where
-
-import           Test.Hspec
-import           Test.QuickCheck
-
-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
-
-    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
-
-  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"
-#endif
-
-    it "works for arbitrary values" $
-      property $ \v -> ('\NUL' `notElem` v && (not . null) v) ==> do
-        setEnv "FOO" v
-        getEnv "FOO" `shouldReturn` v
-
-    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
-
-    it "works for arbitrary keys" $
-      property $ \k -> ('\NUL' `notElem` k && '=' `notElem` k && (not . null) k) ==> do
-        setEnv k "foo"
-        getEnv k `shouldReturn` "foo"
diff --git a/test/Text/Read/CompatSpec.hs b/test/Text/Read/CompatSpec.hs
deleted file mode 100644
--- a/test/Text/Read/CompatSpec.hs
+++ /dev/null
@@ -1,24 +0,0 @@
-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)
