diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,5 +1,7 @@
 # mixed-types-num change log
 
+* v 0.5.11 2022-08-25
+  * left-first and/or for CE/CN monad
 * v 0.5.10 2022-07-13
   * isValid and spec helpers for validity of operations
 * v 0.5.9 2021-08-04
diff --git a/mixed-types-num.cabal b/mixed-types-num.cabal
--- a/mixed-types-num.cabal
+++ b/mixed-types-num.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           mixed-types-num
-version:        0.5.10
+version:        0.5.11
 synopsis:       Alternative Prelude with numeric and logic expressions typed bottom-up
 description:    Please see the README on GitHub at <https://github.com/michalkonecny/mixed-types-num#readme>
 category:       Math
diff --git a/src/Numeric/MixedTypes/Bool.hs b/src/Numeric/MixedTypes/Bool.hs
--- a/src/Numeric/MixedTypes/Bool.hs
+++ b/src/Numeric/MixedTypes/Bool.hs
@@ -250,13 +250,22 @@
   or2 = (P.||)
 
 instance
-  (CanAndOrAsymmetric t1 t2, CanBeErrors es)
+  (CanAndOrAsymmetric t1 t2, CanBeErrors es,
+  HasBools t2, CanTestCertainly t1)
   =>
   CanAndOrAsymmetric (CollectErrors es t1) (CollectErrors es t2)
   where
   type AndOrType (CollectErrors es t1) (CollectErrors es t2) = CollectErrors es (AndOrType t1 t2)
-  and2 = CE.lift2 and2
-  or2 = CE.lift2 or2
+  and2 b1CE (b2CE::b2T) = 
+    case b1CE of
+      CE.CollectErrors (Just b1) _ | isCertainlyFalse b1 -> 
+        CE.lift2 and2 b1CE (convertExactly False :: b2T) -- avoid evaluating b2CE
+      _ -> CE.lift2 and2 b1CE b2CE
+  or2 b1CE (b2CE::b2T) = 
+    case b1CE of
+      CE.CollectErrors (Just b1) _ | isCertainlyTrue b1 -> 
+        CE.lift2 or2 b1CE (convertExactly True :: b2T) -- avoid evaluating b2CE
+      _ -> CE.lift2 or2 b1CE b2CE
 
 instance
   (CanAndOrAsymmetric t1 Bool, CanBeErrors es)
diff --git a/src/Numeric/MixedTypes/Eq.hs b/src/Numeric/MixedTypes/Eq.hs
--- a/src/Numeric/MixedTypes/Eq.hs
+++ b/src/Numeric/MixedTypes/Eq.hs
@@ -222,7 +222,7 @@
   equalTo _ _ = convertExactly False
 
 instance
-  (HasEqAsymmetric a b, CanBeErrors es)
+  (HasEqAsymmetric a b, CanBeErrors es, CanTestCertainly (EqCompareType a b))
   =>
   HasEqAsymmetric (CollectErrors es a) (CollectErrors es  b)
   where
@@ -235,7 +235,7 @@
   (\ t -> [d|
 
     instance
-      (HasEqAsymmetric $t b, CanBeErrors es)
+      (HasEqAsymmetric $t b, CanBeErrors es, CanTestCertainly (EqCompareType $t b))
       =>
       HasEqAsymmetric $t (CollectErrors es  b)
       where
@@ -244,7 +244,7 @@
       equalTo = CE.liftT1 equalTo
 
     instance
-      (HasEqAsymmetric a $t, CanBeErrors es)
+      (HasEqAsymmetric a $t, CanBeErrors es, CanTestCertainly (EqCompareType a $t))
       =>
       HasEqAsymmetric (CollectErrors es a) $t
       where
diff --git a/src/Numeric/MixedTypes/Ord.hs b/src/Numeric/MixedTypes/Ord.hs
--- a/src/Numeric/MixedTypes/Ord.hs
+++ b/src/Numeric/MixedTypes/Ord.hs
@@ -193,7 +193,7 @@
   leq d n = leq d (integer n)
 
 instance
-  (HasOrderAsymmetric a b, CanBeErrors es)
+  (HasOrderAsymmetric a b, CanBeErrors es, CanTestCertainly (OrderCompareType a b))
   =>
   HasOrderAsymmetric (CollectErrors es a) (CollectErrors es b)
   where
@@ -209,7 +209,7 @@
   (\ t -> [d|
 
     instance
-      (HasOrderAsymmetric $t b, CanBeErrors es)
+      (HasOrderAsymmetric $t b, CanBeErrors es, CanTestCertainly (OrderCompareType $t b))
       =>
       HasOrderAsymmetric $t (CollectErrors es  b)
       where
@@ -221,7 +221,7 @@
       geq = CE.liftT1 geq
 
     instance
-      (HasOrderAsymmetric a $t, CanBeErrors es)
+      (HasOrderAsymmetric a $t, CanBeErrors es, CanTestCertainly (OrderCompareType a $t))
       =>
       HasOrderAsymmetric (CollectErrors es a) $t
       where
