diff --git a/CHANGES.markdown b/CHANGES.markdown
--- a/CHANGES.markdown
+++ b/CHANGES.markdown
@@ -1,6 +1,17 @@
+## Changes in 0.10.2 [2018.07.02]
+ - Sync with `base-4.12`/GHC 8.6
+ - Backport `RuntimeRep`-polymorphic versions of `($!)` and `throw` to
+   `Prelude.Compat` and `Control.Exception.Compat`, respectively
+   (if using `base-4.10`/GHC 8.2 or later).
+ - Introduce the `Data.Functor.Contravariant.Compat` module, which reexports
+   `Data.Functor.Contravariant` if using `base-4.12`/GHC 8.6 or later.
+
+   See `Data.Functor.Contravariant.Compat` in the corresponding
+   `base-compat-batteries` release for a version with a wider support window.
+
 ## Changes in 0.10.1 [2018.04.10]
-- Add `Data.List.NonEmpty.Compat`.
-- Reexport `(Data.Semigroup.<>)` from `Data.Monoid.Compat` back to `base-4.9`.
+ - Add `Data.List.NonEmpty.Compat`.
+ - Reexport `(Data.Semigroup.<>)` from `Data.Monoid.Compat` back to `base-4.9`.
 
 ## Changes in 0.10.0 [2018.04.05]
  - Sync with `base-4.11`/GHC 8.4
diff --git a/README.markdown b/README.markdown
--- a/README.markdown
+++ b/README.markdown
@@ -148,6 +148,8 @@
  * `showFFloatAlt` and `showGFloatAlt` to `Numeric.Compat`
  * `lookupEnv`, `setEnv` and `unsetEnv` to `System.Environment.Compat`
  * `unsafeFixIO` and `unsafeDupablePerformIO` to `System.IO.Unsafe.IO`
+ * `RuntimeRep`-polymorphic `($!)` to `Prelude.Compat`
+ * `RuntimeRep`-polymorphic `throw` to `Control.Exception.Compat`
 
 ## What is not covered
 
@@ -258,6 +260,9 @@
   * The [`Bifoldable`](http://hackage.haskell.org/package/base-4.10.0.0/docs/Data-Bifoldable.html#t:Bifoldable)
     and [`Bitraversable`](http://hackage.haskell.org/package/base-4.10.0.0/docs/Data-Bitraversable.html#t:Bitraversable)
     type classes, introduced in `base-4.10.0.0`
+* [`contravariant`](http://hackage.haskell.org/package/contravariant)
+  for the [`Contravariant`](http://hackage.haskell.org/package/base-4.12.0.0/docs/Data-Functor-Contravariant.html#t:Contravariant)
+  type class, introduced in `base-4.12.0.0`.
 * [`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`
@@ -297,6 +302,9 @@
 
 ## Supported versions of GHC/`base`
 
+ * `ghc-8.6.1`  / `base-4.12.0.0`
+ * `ghc-8.4.3`  / `base-4.11.1.0`
+ * `ghc-8.4.2`  / `base-4.11.1.0`
  * `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`
diff --git a/base-compat.cabal b/base-compat.cabal
--- a/base-compat.cabal
+++ b/base-compat.cabal
@@ -1,5 +1,5 @@
 name:             base-compat
-version:          0.10.1
+version:          0.10.2
 license:          MIT
 license-file:     LICENSE
 copyright:        (c) 2012-2018 Simon Hengel,
@@ -51,7 +51,8 @@
                   , 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
+                  , GHC == 8.4.1,  GHC == 8.4.2,  GHC == 8.4.3
+                  , GHC == 8.6.1
 extra-source-files: CHANGES.markdown, README.markdown
 
 source-repository head
@@ -75,6 +76,7 @@
   exposed-modules:
       Control.Concurrent.Compat
       Control.Concurrent.MVar.Compat
+      Control.Exception.Compat
       Control.Monad.Compat
       Control.Monad.Fail.Compat
       Control.Monad.IO.Class.Compat
@@ -92,6 +94,7 @@
       Data.Functor.Compat
       Data.Functor.Compose.Compat
       Data.Functor.Const.Compat
+      Data.Functor.Contravariant.Compat
       Data.Functor.Identity.Compat
       Data.Functor.Product.Compat
       Data.Functor.Sum.Compat
@@ -130,6 +133,7 @@
 
       Control.Concurrent.Compat.Repl
       Control.Concurrent.MVar.Compat.Repl
+      Control.Exception.Compat.Repl
       Control.Monad.Compat.Repl
       Control.Monad.Fail.Compat.Repl
       Control.Monad.IO.Class.Compat.Repl
@@ -147,6 +151,7 @@
       Data.Functor.Compat.Repl
       Data.Functor.Compose.Compat.Repl
       Data.Functor.Const.Compat.Repl
+      Data.Functor.Contravariant.Compat.Repl
       Data.Functor.Identity.Compat.Repl
       Data.Functor.Product.Compat.Repl
       Data.Functor.Sum.Compat.Repl
diff --git a/src/Control/Exception/Compat.hs b/src/Control/Exception/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Exception/Compat.hs
@@ -0,0 +1,22 @@
+{-# LANGUAGE CPP, NoImplicitPrelude #-}
+#if MIN_VERSION_base(4,10,0)
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE TypeInType #-}
+#endif
+module Control.Exception.Compat (
+  module Base
+, throw
+) where
+
+import Control.Exception as Base
+#if MIN_VERSION_base(4,10,0) && !(MIN_VERSION_base(4,12,0))
+  hiding (throw)
+import GHC.Exts (RuntimeRep, TYPE, raise#)
+
+-- | Throw an exception.  Exceptions may be thrown from purely
+-- functional code, but may only be caught within the 'IO' monad.
+throw :: forall (r :: RuntimeRep). forall (a :: TYPE r). forall e.
+         Exception e => e -> a
+throw e = raise# (toException e)
+#endif
diff --git a/src/Control/Exception/Compat/Repl.hs b/src/Control/Exception/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Exception/Compat/Repl.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Control.Exception.Compat"
+-- from a globally unique namespace.
+module Control.Exception.Compat.Repl (
+  module Control.Exception.Compat
+) where
+import "this" Control.Exception.Compat
diff --git a/src/Data/Functor/Contravariant/Compat.hs b/src/Data/Functor/Contravariant/Compat.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Functor/Contravariant/Compat.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE CPP, NoImplicitPrelude #-}
+module Data.Functor.Contravariant.Compat (
+#if MIN_VERSION_base(4,12,0)
+  module Base
+#endif
+) where
+
+#if MIN_VERSION_base(4,12,0)
+import Data.Functor.Contravariant as Base
+#endif
diff --git a/src/Data/Functor/Contravariant/Compat/Repl.hs b/src/Data/Functor/Contravariant/Compat/Repl.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Functor/Contravariant/Compat/Repl.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE PackageImports #-}
+{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-unused-imports #-}
+-- | Reexports "Data.Functor.Contravariant.Compat"
+-- from a globally unique namespace.
+module Data.Functor.Contravariant.Compat.Repl (
+  module Data.Functor.Contravariant.Compat
+) where
+import "this" Data.Functor.Contravariant.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,10 @@
 {-# LANGUAGE CPP, NoImplicitPrelude #-}
+#if MIN_VERSION_base(4,10,0) && !(MIN_VERSION_base(4,12,0))
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE TypeInType #-}
+#endif
 module Prelude.Compat (
-#if MIN_VERSION_base(4,11,0)
+#if MIN_VERSION_base(4,12,0)
   module Base
 #else
   either
@@ -267,6 +271,9 @@
 #if MIN_VERSION_base(4,9,0)
 
 import Prelude as Base
+# if MIN_VERSION_base(4,10,0) && !(MIN_VERSION_base(4,12,0))
+  hiding (($!))
+# endif
 
 #else
 
@@ -311,6 +318,10 @@
 import Data.Semigroup as Base (Semigroup((<>)))
 #endif
 
+#if MIN_VERSION_base(4,10,0) && !(MIN_VERSION_base(4,12,0))
+import GHC.Exts (TYPE)
+#endif
+
 #if !(MIN_VERSION_base(4,9,0))
 -- | A variant of 'error' that does not produce a stack trace.
 --
@@ -318,4 +329,13 @@
 errorWithoutStackTrace :: [Char] -> a
 errorWithoutStackTrace s = error s
 {-# NOINLINE errorWithoutStackTrace #-}
+#endif
+
+#if MIN_VERSION_base(4,10,0) && !(MIN_VERSION_base(4,12,0))
+-- | Strict (call-by-value) application operator. It takes a function and an
+-- argument, evaluates the argument to weak head normal form (WHNF), then calls
+-- the function with that value.
+
+($!) :: forall r a (b :: TYPE r). (a -> b) -> a -> b
+f $! x = let !vx = x in f vx  -- see #2273
 #endif
