diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,11 @@
 # Changelog for collect-errors
 
+## v0.1.2.0
+
+* Add CanTakeErrors type class and liftTakeErrors function
+
+* Add instance of deepseq's NFData
+
 ## v0.1.1.0
 
 * Add removeValue functions
diff --git a/collect-errors.cabal b/collect-errors.cabal
--- a/collect-errors.cabal
+++ b/collect-errors.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 5f417d9a5348a4f9b717f189c1f3f9770e6a4a4acf3d3840841fbd82f9ac2ef0
+-- hash: 9a5c7d7488a22cd99bc416d26c4ed4d2d2e8f07224b622d5cec563fcffc839d2
 
 name:           collect-errors
-version:        0.1.1.0
+version:        0.1.2.0
 synopsis:       Error monad with a Float instance
 description:    Please see the README on GitHub at <https://github.com/michalkonecny/collect-errors#readme>
 category:       Math
@@ -44,4 +44,5 @@
       QuickCheck >=2.7
     , base >=4.7 && <5
     , containers
+    , deepseq
   default-language: Haskell2010
diff --git a/src/Control/CollectErrors.hs b/src/Control/CollectErrors.hs
--- a/src/Control/CollectErrors.hs
+++ b/src/Control/CollectErrors.hs
@@ -26,6 +26,8 @@
 , lift2pair
 , lift1Tpair
 , liftT1pair
+, CanTakeErrors(..)
+, liftTakeErrors
 )
 where
 
diff --git a/src/Control/CollectErrors/Type.hs b/src/Control/CollectErrors/Type.hs
--- a/src/Control/CollectErrors/Type.hs
+++ b/src/Control/CollectErrors/Type.hs
@@ -1,10 +1,17 @@
 {-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE FlexibleInstances #-}
 module Control.CollectErrors.Type where
 
 import Prelude
 
 import Control.Applicative ( Applicative(liftA2), liftA )
 
+import GHC.Generics
+import Control.DeepSeq
+
 import qualified Data.Set as Set
 
 import Test.QuickCheck ( Arbitrary(arbitrary) )
@@ -27,6 +34,7 @@
   CollectErrors
     { getMaybeValue :: Maybe v
     , getErrors :: es }
+  deriving (Generic, Generic1, NFData, NFData1)
 
 class CanTestErrorsCertain es where
   hasCertainError :: es -> Bool
@@ -125,6 +133,20 @@
   (CollectErrors _ ae) <*> (CollectErrors _ be) =
     CollectErrors Nothing (ae <> be)
 
+instance (Monoid es) => Monad (CollectErrors es) where
+  ae >>= f =
+    case ae of
+      CollectErrors (Just a) es1 ->
+        let (CollectErrors mv es2) = f a in
+          CollectErrors mv (es1 <> es2)
+      CollectErrors _ es ->
+        CollectErrors Nothing es
+
+instance (Arbitrary t, Monoid es) => Arbitrary (CollectErrors es t) where
+  arbitrary = (\v -> CollectErrors (Just v) mempty) <$> arbitrary
+
+-- Various lifts:
+
 lift :: (Monoid es) => (a -> b) -> (CollectErrors es a) -> (CollectErrors es b)
 lift = liftA
 
@@ -194,15 +216,21 @@
 liftT1pair _ _ (CollectErrors _ be) = 
   (CollectErrors Nothing be, CollectErrors Nothing be)
 
-instance (Monoid es) => Monad (CollectErrors es) where
-  ae >>= f =
-    case ae of
-      CollectErrors (Just a) es1 ->
-        let (CollectErrors mv es2) = f a in
-          CollectErrors mv (es1 <> es2)
-      CollectErrors _ es ->
-        CollectErrors Nothing es
+liftTakeErrors :: (CanTakeErrors es t2) => (t1 -> t2) -> (CollectErrors es t1 -> t2)
+liftTakeErrors f (CollectErrors (Just v) e) = 
+  takeErrors e $ f v
+liftTakeErrors _f (CollectErrors _ e) = 
+  takeErrorsNoValue e
 
-instance (Arbitrary t, Monoid es) => Arbitrary (CollectErrors es t) where
-  arbitrary = (\v -> CollectErrors (Just v) mempty) <$> arbitrary
+class CanTakeErrors es t where
+  takeErrors :: es -> t -> t
+  takeErrorsNoValue :: es -> t
 
+instance (Monoid es) => CanTakeErrors es (CollectErrors es t) where
+  takeErrors es1 (CollectErrors v es2) = CollectErrors v (es1 <> es2)
+  takeErrorsNoValue es = CollectErrors Nothing es
+
+instance (CanTakeErrors es t1, CanTakeErrors es t2) => CanTakeErrors es (t1,t2) where
+  takeErrors es (v1,v2) = (takeErrors es v1, takeErrors es v2)
+  takeErrorsNoValue es = (takeErrorsNoValue es, takeErrorsNoValue es)
+  
diff --git a/src/Numeric/CollectErrors.hs b/src/Numeric/CollectErrors.hs
--- a/src/Numeric/CollectErrors.hs
+++ b/src/Numeric/CollectErrors.hs
@@ -27,6 +27,8 @@
 , lift2pair
 , lift1Tpair
 , liftT1pair
+, CanTakeErrors(..)
+, liftTakeErrors
 )
 where
 
diff --git a/src/Numeric/CollectErrors/Type.hs b/src/Numeric/CollectErrors/Type.hs
--- a/src/Numeric/CollectErrors/Type.hs
+++ b/src/Numeric/CollectErrors/Type.hs
@@ -1,10 +1,14 @@
 {-# LANGUAGE TypeSynonymInstances #-}
 {-# LANGUAGE FlexibleInstances #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE DeriveGeneric #-}
 module Numeric.CollectErrors.Type 
 
 where
 
+import GHC.Generics
+import Control.DeepSeq
+
 import qualified Data.List as List
 import qualified Data.Set as Set
 
@@ -19,7 +23,7 @@
 
 type CN = CollectErrors NumErrors
 newtype NumErrors = NumErrors (Set.Set NumErrorLevel)
-  deriving (Eq,Semigroup, Monoid, CanTestErrorsCertain, CanTestErrorsPresent)
+  deriving (Eq, Semigroup, Monoid, CanTestErrorsCertain, CanTestErrorsPresent, Generic, NFData)
 type NumErrorLevel = (NumError, ErrorCertaintyLevel)
 
 instance Show NumErrors where
@@ -31,8 +35,10 @@
 
 data NumError =
     DivByZero | OutOfDomain String | NumError String
-    deriving (Eq, Ord)
+    deriving (Eq, Ord, Generic)
 
+instance NFData NumError
+
 instance Show NumError where
   show DivByZero = "division by 0"
   show (OutOfDomain s) = "out of domain: " ++ s
@@ -40,7 +46,9 @@
 
 data ErrorCertaintyLevel =
   ErrorCertain | ErrorPotential
-  deriving (Eq, Ord)
+  deriving (Eq, Ord, Generic)
+
+instance NFData ErrorCertaintyLevel
 
 instance Show ErrorCertaintyLevel where
   show ErrorCertain = "ERROR"
