diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+## Parser combinators 1.0.2
+
+* Defined `liftA2` for `Permutation` manually. The new definition should be
+  more efficient.
+
+* Made inner `Maybe` field in `Permutation` strict.
+
 ## Parser combinators 1.0.1
 
 * Cosmetic changes in the source code.
diff --git a/Control/Applicative/Permutations.hs b/Control/Applicative/Permutations.hs
--- a/Control/Applicative/Permutations.hs
+++ b/Control/Applicative/Permutations.hs
@@ -40,6 +40,8 @@
 --
 -- @since 0.2.0
 
+{-# LANGUAGE CPP #-}
+
 module Control.Applicative.Permutations
   ( -- ** Permutation type
     Permutation
@@ -55,7 +57,7 @@
 
 -- | An 'Applicative' wrapper-type for constructing permutation parsers.
 
-data Permutation m a = P (Maybe a) (m (Permutation m a))
+data Permutation m a = P !(Maybe a) (m (Permutation m a))
 
 instance Functor m => Functor (Permutation m) where
   fmap f (P v p) = P (f <$> v) (fmap f <$> p)
@@ -66,6 +68,12 @@
     where
       lhsAlt = (<*> rhs) <$> v
       rhsAlt = (lhs <*>) <$> w
+#if MIN_VERSION_base(4,10,0)
+  liftA2 f lhs@(P x v) rhs@(P y w) = P (liftA2 f x y) (lhsAlt <|> rhsAlt)
+    where
+      lhsAlt = (\p -> liftA2 f p rhs) <$> v
+      rhsAlt = liftA2 f lhs <$> w
+#endif
 
 -- | \"Unlifts\" a permutation parser into a parser to be evaluated.
 
diff --git a/parser-combinators.cabal b/parser-combinators.cabal
--- a/parser-combinators.cabal
+++ b/parser-combinators.cabal
@@ -1,7 +1,7 @@
 name:                 parser-combinators
-version:              1.0.1
+version:              1.0.2
 cabal-version:        1.18
-tested-with:          GHC==7.10.3, GHC==8.0.2, GHC==8.2.2, GHC==8.4.4, GHC==8.6.3
+tested-with:          GHC==7.10.3, GHC==8.0.2, GHC==8.2.2, GHC==8.4.4, GHC==8.6.4
 license:              BSD3
 license-file:         LICENSE.md
 author:               Mark Karpov <markkarpov92@gmail.com>
