diff --git a/mixed-types-num.cabal b/mixed-types-num.cabal
--- a/mixed-types-num.cabal
+++ b/mixed-types-num.cabal
@@ -1,6 +1,6 @@
 name:           mixed-types-num
-version:        0.4.0.1
-cabal-version:  >= 1.9.2
+version:        0.4.0.2
+cabal-version:  >= 1.10
 build-type:     Simple
 homepage:       https://github.com/michalkonecny/mixed-types-num
 author:         Michal Konecny
@@ -40,17 +40,9 @@
 
 library
   hs-source-dirs:  src
-  build-depends:
-    base >= 4.8 && < 5
-    -- , convertible >= 1.1.1.0
-    , template-haskell
-    , mtl
-    , hspec >= 2.1
-    , hspec-smallcheck >= 0.3
-    , smallcheck == 1.1.*
-    , QuickCheck >= 2.7
   ghc-options:     -Wall -fno-warn-orphans
-  extensions:
+  default-language: Haskell2010
+  default-extensions:
     RebindableSyntax,
     PostfixOperators,
     ScopedTypeVariables,
@@ -62,6 +54,17 @@
     FlexibleContexts,
     FlexibleInstances,
     UndecidableInstances
+  other-extensions:
+    TemplateHaskell
+  build-depends:
+    base >= 4.8 && < 5
+    -- , convertible >= 1.1.1.0
+    , template-haskell
+    , mtl
+    , hspec >= 2.1
+    , hspec-smallcheck >= 0.3
+    , smallcheck >= 1.1
+    , QuickCheck >= 2.7
   exposed-modules:
     Utils.TH.DeclForTypes
     Utils.Test.EnforceRange
@@ -90,7 +93,8 @@
       exitcode-stdio-1.0
   ghc-options:
       -Wall
-  extensions:
+  default-language: Haskell2010
+  default-extensions:
     RebindableSyntax,
     PostfixOperators,
     ScopedTypeVariables,
diff --git a/src/Control/CollectErrors.hs b/src/Control/CollectErrors.hs
--- a/src/Control/CollectErrors.hs
+++ b/src/Control/CollectErrors.hs
@@ -10,7 +10,7 @@
 -- * Tools for avoiding @CollectErrors(CollectErrors t)@ and putting CE inside containers
 , CanEnsureCE(..)
 , getValueOrThrowErrorsNCE
-, lift1CE, lift2CE, lift2TCE, lift2TLCE
+, lift1CE, lift2CE, lift2TCE, lift2TLCE, lift3CE
 -- ** Tools for pulling errors out of structures
 , CanExtractCE(..)
 )
@@ -396,6 +396,30 @@
   (a -> b -> c) ->
   a -> (CollectErrors es b) -> (EnsureCE es c)
 lift2TLCE f = flip $ lift2TCE (flip f)
+
+{-|
+  Add error collection support to a binary function whose
+  result may already have collected errors.
+-}
+lift3CE ::
+  (SuitableForCE es
+  , CanEnsureCE es a, CanEnsureCE es b, CanEnsureCE es c, CanEnsureCE es d)
+  =>
+  (a -> b -> c -> d) ->
+  (CollectErrors es a) -> (CollectErrors es b) -> (CollectErrors es c) -> (EnsureCE es d)
+lift3CE fn aCE bCE cCE =
+  case (ma, mb, mc) of
+    (Just a, Just b, Just c) ->
+      prependErrorsECE sample_d abc_es $ ensureCE sample_es $ fn a b c
+    _ ->
+      noValueECE sample_d abc_es
+  where
+  CollectErrors ma a_es = aCE
+  CollectErrors mb b_es = bCE
+  CollectErrors mc c_es = cCE
+  abc_es = a_es <> b_es <> c_es
+  sample_es = Just a_es
+  sample_d = fn <$> ma <*> mb <*> mc
 
 
 {-|
