diff --git a/.travis.yml b/.travis.yml
--- a/.travis.yml
+++ b/.travis.yml
@@ -31,9 +31,12 @@
     - env: CABALVER=1.22 GHCVER=7.10.3
       compiler: ": #GHC 7.10.3"
       addons: {apt: {packages: [cabal-install-1.22,ghc-7.10.3], sources: [hvr-ghc]}}
-    - env: CABALVER=1.24 GHCVER=8.0.1
-      compiler: ": #GHC 8.0.1"
-      addons: {apt: {packages: [cabal-install-1.24,ghc-8.0.1], sources: [hvr-ghc]}}
+    - env: CABALVER=1.24 GHCVER=8.0.2
+      compiler: ": #GHC 8.0.2"
+      addons: {apt: {packages: [cabal-install-1.24,ghc-8.0.2], sources: [hvr-ghc]}}
+    - env: CABALVER=2.0 GHCVER=8.2.1
+      compiler: ": #GHC 8.2.1"
+      addons: {apt: {packages: [cabal-install-2.0,ghc-8.2.1], sources: [hvr-ghc]}}
     - env: CABALVER=head GHCVER=head
       compiler: ": #GHC head"
       addons: {apt: {packages: [cabal-install-head,ghc-head], sources: [hvr-ghc]}}
diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown
--- a/CHANGELOG.markdown
+++ b/CHANGELOG.markdown
@@ -1,3 +1,8 @@
+5.4.2
+-----
+* Make `deriveBitraversable` use `liftA2` in derived implementations of `bitraverse` when possible, now that `liftA2` is a class method of `Applicative` (as of GHC 8.2)
+* Backport slightly more efficient implementations of `bimapDefault` and `bifoldMapDefault`
+
 5.4.1
 -----
 * Add explicit `Safe`, `Trustworthy`, and `Unsafe` annotations. In particular, annotate the `Data.Bifoldable` module as `Trustworthy` (previously, it was inferred to be `Unsafe`).
diff --git a/bifunctors.cabal b/bifunctors.cabal
--- a/bifunctors.cabal
+++ b/bifunctors.cabal
@@ -1,6 +1,6 @@
 name:          bifunctors
 category:      Data, Functors
-version:       5.4.1
+version:       5.4.2
 license:       BSD3
 cabal-version: >= 1.8
 license-file:  LICENSE
@@ -13,12 +13,12 @@
 synopsis:      Bifunctors
 description:   Bifunctors
 build-type:    Simple
-tested-with:   GHC == 7.0.4, GHC == 7.2.2, GHC == 7.4.2, GHC == 7.6.3, GHC == 7.8.4, GHC == 7.10.3, GHC == 8.0.1
+tested-with:   GHC == 7.0.4, GHC == 7.2.2, GHC == 7.4.2, GHC == 7.6.3, GHC == 7.8.4, GHC == 7.10.3, GHC == 8.0.2
 extra-source-files: .travis.yml CHANGELOG.markdown README.markdown
 
 source-repository head
   type: git
-  location: git://github.com/ekmett/bifunctors.git
+  location: https://github.com/ekmett/bifunctors.git
 
 flag semigroups
   default: True
@@ -43,7 +43,7 @@
     base-orphans        >= 0.5.2 && < 1,
     comonad             >= 4     && < 6,
     containers          >= 0.1   && < 0.6,
-    template-haskell    >= 2.4   && < 2.12,
+    template-haskell    >= 2.4   && < 2.13,
     transformers        >= 0.2   && < 0.6,
     transformers-compat >= 0.5   && < 0.6
 
@@ -99,6 +99,7 @@
     bifunctors,
     hspec               >= 1.8,
     QuickCheck          >= 2   && < 3,
+    template-haskell,
     transformers,
     transformers-compat
 
diff --git a/old-src/ghc801/Data/Bitraversable.hs b/old-src/ghc801/Data/Bitraversable.hs
--- a/old-src/ghc801/Data/Bitraversable.hs
+++ b/old-src/ghc801/Data/Bitraversable.hs
@@ -1,10 +1,9 @@
 {-# LANGUAGE CPP #-}
 {-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE StandaloneDeriving #-}
 
 #if __GLASGOW_HASKELL__ >= 704
-{-# LANGUAGE Safe #-}
-#elif __GLASGOW_HASKELL__ >= 702
 {-# LANGUAGE Trustworthy #-}
 #endif
 
@@ -39,8 +38,15 @@
 import Data.Bifunctor
 import Data.Bifoldable
 import Data.Functor.Constant
+import Data.Functor.Identity
 import Data.Orphans ()
 
+#if MIN_VERSION_base(4,7,0)
+import Data.Coerce (coerce)
+#else
+import Unsafe.Coerce (unsafeCoerce)
+#endif
+
 #if !(MIN_VERSION_base(4,8,0))
 import Data.Monoid
 #endif
@@ -69,7 +75,7 @@
 -- element on which an action can be performed, 'Bitraversable' data structures
 -- have two such varieties of elements.
 --
--- A definition of 'traverse' must satisfy the following laws:
+-- A definition of 'bitraverse' must satisfy the following laws:
 --
 -- [/naturality/]
 --   @'bitraverse' (t . f) (t . g) ≡ t . 'bitraverse' f g@
@@ -295,24 +301,29 @@
 bimapAccumR f g s t = runStateR (bitraverse (StateR . flip f) (StateR . flip g) t) s
 {-# INLINE bimapAccumR #-}
 
-newtype Id a = Id { getId :: a }
-
-instance Functor Id where
-  fmap f (Id x) = Id (f x)
-  {-# INLINE fmap #-}
-
-instance Applicative Id where
-  pure = Id
-  {-# INLINE pure #-}
-  Id f <*> Id x = Id (f x)
-  {-# INLINE (<*>) #-}
-
 -- | A default definition of 'bimap' in terms of the 'Bitraversable' operations.
-bimapDefault :: Bitraversable t => (a -> b) -> (c -> d) -> t a c -> t b d
-bimapDefault f g = getId . bitraverse (Id . f) (Id . g)
+--
+-- @'bimapDefault' f g ≡
+--     'runIdentity' . 'bitraverse' ('Identity' . f) ('Identity' . g)@
+bimapDefault :: forall t a b c d . Bitraversable t
+             => (a -> b) -> (c -> d) -> t a c -> t b d
+bimapDefault = coerce
+  (bitraverse :: (a -> Identity b)
+              -> (c -> Identity d) -> t a c -> Identity (t b d))
 {-# INLINE bimapDefault #-}
 
 -- | A default definition of 'bifoldMap' in terms of the 'Bitraversable' operations.
-bifoldMapDefault :: (Bitraversable t, Monoid m) => (a -> m) -> (b -> m) -> t a b -> m
-bifoldMapDefault f g = getConst . bitraverse (Const . f) (Const . g)
+--
+-- @'bifoldMapDefault' f g ≡
+--    'getConst' . 'bitraverse' ('Const' . f) ('Const' . g)@
+bifoldMapDefault :: forall t m a b . (Bitraversable t, Monoid m)
+                 => (a -> m) -> (b -> m) -> t a b -> m
+bifoldMapDefault = coerce
+  (bitraverse :: (a -> Const m ())
+              -> (b -> Const m ()) -> t a b -> Const m (t () ()))
 {-# INLINE bifoldMapDefault #-}
+
+#if !(MIN_VERSION_base(4,7,0))
+coerce :: a -> b
+coerce = unsafeCoerce
+#endif
diff --git a/src/Data/Bifunctor/TH.hs b/src/Data/Bifunctor/TH.hs
--- a/src/Data/Bifunctor/TH.hs
+++ b/src/Data/Bifunctor/TH.hs
@@ -1189,9 +1189,10 @@
     conExp <- conExpQ
 
     let go :: [Exp] -> Exp
-        go []     = VarE pureValName `AppE` conExp
-        go (e:es) = foldl' (\e1 e2 -> InfixE (Just e1) (VarE apValName) (Just e2))
-          (VarE fmapValName `AppE` conExp `AppE` e) es
+        go []  = VarE pureValName `AppE` conExp
+        go [e] = VarE fmapValName `AppE` conExp `AppE` e
+        go (e1:e2:es) = foldl' (\se1 se2 -> InfixE (Just se1) (VarE apValName) (Just se2))
+          (VarE liftA2ValName `AppE` conExp `AppE` e1 `AppE` e2) es
 
     return . go . rights $ ess
 
diff --git a/src/Data/Bifunctor/TH/Internal.hs b/src/Data/Bifunctor/TH/Internal.hs
--- a/src/Data/Bifunctor/TH/Internal.hs
+++ b/src/Data/Bifunctor/TH/Internal.hs
@@ -592,6 +592,9 @@
 apValName :: Name
 apValName = mkNameG_v "base" "GHC.Base" "<*>"
 
+liftA2ValName :: Name
+liftA2ValName = mkNameG_v "base" "GHC.Base" "liftA2"
+
 mappendValName :: Name
 mappendValName = mkNameG_v "base" "GHC.Base" "mappend"
 
@@ -610,6 +613,9 @@
 apValName :: Name
 apValName = mkNameG_v "base" "Control.Applicative" "<*>"
 
+liftA2ValName :: Name
+liftA2ValName = mkNameG_v "base" "Control.Applicative" "liftA2"
+
 mappendValName :: Name
 mappendValName = mkNameG_v "base" "Data.Monoid" "mappend"
 
@@ -617,7 +623,7 @@
 memptyValName = mkNameG_v "base" "Data.Monoid" "mempty"
 #endif
 
-#if __GLASGOW_HASKELL__ >= 801
+#if MIN_VERSION_base(4,10,0)
 bifoldableTypeName :: Name
 bifoldableTypeName = mkNameG_tc "base" "Data.Bifoldable" "Bifoldable"
 
