diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,14 @@
+### 0.5 [2018.07.01]
+* Backport the changes to `GeneralizedNewtypeDeriving` and `DerivingVia` code
+  generation from
+  [Trac #15290](https://ghc.haskell.org/trac/ghc/ticket/15290).
+
+  As a result, code generated by `deriveGND` or `deriveVia` now requires the
+  `InstanceSigs` language extension. On the other hand, the generated code
+  no longer requires the `ImpredicativeTypes` extension (unless any class
+  methods use higher-rank types).
+* Allow building with `containers-0.6` and `template-haskell-2.14`.
+
 ### 0.4.3 [2018.06.16]
 * Fix a bug that caused debug-enabled GHC builds to panic when generating
   code from this library (see
diff --git a/deriving-compat.cabal b/deriving-compat.cabal
--- a/deriving-compat.cabal
+++ b/deriving-compat.cabal
@@ -1,5 +1,5 @@
 name:                deriving-compat
-version:             0.4.3
+version:             0.5
 synopsis:            Backports of GHC deriving extensions
 description:         Provides Template Haskell functions that mimic deriving
                      extensions that were introduced or modified in recent versions
@@ -71,6 +71,7 @@
                    , GHC == 8.0.2
                    , GHC == 8.2.2
                    , GHC == 8.4.3
+                   , GHC == 8.6.1
 cabal-version:       >=1.10
 
 source-repository head
@@ -120,7 +121,7 @@
                        Text.Show.Deriving.Internal
 
                        Paths_deriving_compat
-  build-depends:       containers          >= 0.1   && < 0.6
+  build-depends:       containers          >= 0.1   && < 0.7
                      , ghc-prim
                      , th-abstraction      >= 0.2.2 && < 1
 
@@ -131,7 +132,7 @@
     build-depends:     base                >= 4.3   && < 4.9
 
   if flag(template-haskell-2-11)
-    build-depends:     template-haskell    >= 2.11  && < 2.14
+    build-depends:     template-haskell    >= 2.11  && < 2.15
                      , ghc-boot-th
   else
     build-depends:     template-haskell    >= 2.5   && < 2.11
@@ -167,7 +168,7 @@
                      , hspec               >= 1.8
                      , QuickCheck          >= 2     && < 3
                      , tagged              >= 0.7   && < 1
-                     , template-haskell    >= 2.5   && < 2.14
+                     , template-haskell    >= 2.5   && < 2.15
   build-tool-depends:  hspec-discover:hspec-discover >= 1.8
 
   if flag(base-4-9)
diff --git a/src/Data/Deriving/Via.hs b/src/Data/Deriving/Via.hs
--- a/src/Data/Deriving/Via.hs
+++ b/src/Data/Deriving/Via.hs
@@ -42,7 +42,9 @@
   require you to enable some language extensions (besides @TemplateHaskell@).
   These may include:
 
-    * @ImpredicativeTypes@
+    * @ImpredicativeTypes@ (if any class methods contain higher-rank types)
+
+    * @InstanceSigs@
 
     * @KindSignatures@
 
diff --git a/src/Data/Deriving/Via/Internal.hs b/src/Data/Deriving/Via/Internal.hs
--- a/src/Data/Deriving/Via/Internal.hs
+++ b/src/Data/Deriving/Via/Internal.hs
@@ -122,15 +122,15 @@
                               Nothing -> etaReductionError instanceTy
                           Nothing -> fail $ "Not a newtype: " ++ nameBase dataName
                       _ -> fail $ "Not a data type: " ++ pprint dataTy
-              catMaybes `fmap` traverse (deriveViaDec clsTvbs clsArgs repTy) clsDecs
+              concat . catMaybes <$> traverse (deriveViaDecs' clsTvbs clsArgs repTy) clsDecs
             (_, _) -> fail $ "Cannot derive instance for nullary class " ++ pprint clsTy
         _ -> fail $ "Not a type class: " ++ pprint clsTy
     _ -> fail $ "Malformed instance: " ++ pprint instanceTy
 
-deriveViaDec :: [TyVarBndr] -> [Type] -> Type -> Dec -> Q (Maybe Dec)
-deriveViaDec clsTvbs clsArgs repTy = go
+deriveViaDecs' :: [TyVarBndr] -> [Type] -> Type -> Dec -> Q (Maybe [Dec])
+deriveViaDecs' clsTvbs clsArgs repTy = go
   where
-    go :: Dec -> Q (Maybe Dec)
+    go :: Dec -> Q (Maybe [Dec])
 
     go (OpenTypeFamilyD (TypeFamilyHead tfName tfTvbs _ _)) =
       let lhsSubst = zipTvbSubst clsTvbs clsArgs
@@ -140,18 +140,21 @@
           tfRHSTys = map (applySubstitution rhsSubst) tfTvbTys
           tfRHSTy  = applyTy (ConT tfName) tfRHSTys
           tfInst   = TySynInstD tfName (TySynEqn tfLHSTys tfRHSTy)
-      in return (Just tfInst)
+      in return (Just [tfInst])
 
     go (SigD methName methTy) =
       let (fromTy, toTy) = mkCoerceClassMethEqn clsTvbs clsArgs repTy $
                            stripOuterForallT methTy
-          rhsExpr = VarE coerceValName `AppTypeE` fromTy
-                                       `AppTypeE` toTy
+          fromTau = stripOuterForallT fromTy
+          toTau   = stripOuterForallT toTy
+          rhsExpr = VarE coerceValName `AppTypeE` fromTau
+                                       `AppTypeE` toTau
                                        `AppE`     VarE methName
+          sig  = SigD methName toTy
           meth = ValD (VarP methName)
                       (NormalB rhsExpr)
                       []
-      in return (Just meth)
+      in return (Just [sig, meth])
 
     go _ = return Nothing
 
diff --git a/tests/DerivingViaSpec.hs b/tests/DerivingViaSpec.hs
--- a/tests/DerivingViaSpec.hs
+++ b/tests/DerivingViaSpec.hs
@@ -9,6 +9,7 @@
 
 #if MIN_VERSION_template_haskell(2,12,0)
 {-# LANGUAGE ImpredicativeTypes #-}
+{-# LANGUAGE InstanceSigs #-}
 {-# LANGUAGE TypeApplications #-}
 #endif
 
