Remove the orphan instance of (Eq ErrorCall) from the tests.
diff --git a/tests/EnumeratorTests/Binary/Consume.hs b/tests/EnumeratorTests/Binary/Consume.hs
index cbbe5b9..de54592 100644
--- a/tests/EnumeratorTests/Binary/Consume.hs
+++ b/tests/EnumeratorTests/Binary/Consume.hs
@@ -20,7 +20,7 @@
 import qualified Data.Enumerator.List as EL
 import qualified Data.Enumerator.Binary as EB
 
-import           EnumeratorTests.Util (equalExc)
+import           EnumeratorTests.Util (equalError)
 
 test_Consume :: Suite
 test_Consume = assertions "consume" $ do
@@ -54,7 +54,7 @@
 			x <- EB.head_
 			extra <- EL.consume
 			return (x, extra))
-	$expect $ equalExc
+	$expect $ equalError
 		(ErrorCall "head_: stream has ended")
 		(E.runLists [] $ do
 			x <- EB.head_
diff --git a/tests/EnumeratorTests/Binary/Require.hs b/tests/EnumeratorTests/Binary/Require.hs
index ed954bd..1fd2bd6 100644
--- a/tests/EnumeratorTests/Binary/Require.hs
+++ b/tests/EnumeratorTests/Binary/Require.hs
@@ -18,6 +18,7 @@
 import qualified Data.Enumerator.Binary as EB
 import qualified Data.Enumerator.List as EL
 
+import           EnumeratorTests.Util (throwsError)
 import           EnumeratorTests.Binary.Util
 
 test_Require :: Suite
@@ -52,7 +53,7 @@
 
 test_HandleEOF :: Suite
 test_HandleEOF = assertions "handle-eof" $ do
-	$expect $ throwsEq
+	$expect $ throwsError
 		(Exc.ErrorCall "require: Unexpected EOF")
 		(E.run_ (E.enumLists [] $$ do
 			EB.require 2
diff --git a/tests/EnumeratorTests/Binary/Zip.hs b/tests/EnumeratorTests/Binary/Zip.hs
index 2fcc8ea..598c8d5 100644
--- a/tests/EnumeratorTests/Binary/Zip.hs
+++ b/tests/EnumeratorTests/Binary/Zip.hs
@@ -18,7 +18,7 @@
 import qualified Data.Enumerator.Binary as EB
 import qualified Data.Enumerator.List as EL
 
-import           EnumeratorTests.Util (equalExc)
+import           EnumeratorTests.Util (equalError)
 
 test_ZipN :: (Eq b, Show b) => Text -> E.Iteratee ByteString Identity b -> b -> Suite
 test_ZipN name iter expected = assertions name $ do
@@ -88,14 +88,14 @@
 
 test_ErrorFirst :: Suite
 test_ErrorFirst = assertions "error-first" $ do
-	$expect $ equalExc
+	$expect $ equalError
 		(Exc.ErrorCall "error")
 		(E.runLists [["A"], ["B"], ["C"]] $ do
 			EB.zip (E.throwError (Exc.ErrorCall "error")) (EB.take 1))
 
 test_ErrorSecond :: Suite
 test_ErrorSecond = assertions "error-second" $ do
-	$expect $ equalExc
+	$expect $ equalError
 		(Exc.ErrorCall "error")
 		(E.runLists [["A"], ["B"], ["C"]] $ do
 			EB.zip (EB.take 1) (E.throwError (Exc.ErrorCall "error")))
diff --git a/tests/EnumeratorTests/CatchError.hs b/tests/EnumeratorTests/CatchError.hs
index 9c55b89..5241d03 100644
--- a/tests/EnumeratorTests/CatchError.hs
+++ b/tests/EnumeratorTests/CatchError.hs
@@ -18,7 +18,7 @@
 import qualified Data.Enumerator as E
 import qualified Data.Enumerator.List as EL
 
-import           EnumeratorTests.Util (equalExc, within)
+import           EnumeratorTests.Util (equalError, within)
 
 test_CatchError :: Suite
 test_CatchError = suite "catchError"
@@ -33,7 +33,7 @@
 
 test_WithoutContinue :: Suite
 test_WithoutContinue = assertions "without-continue" $ do
-	$expect $ equalExc
+	$expect $ equalError
 		(Exc.ErrorCall "require: Unexpected EOF")
 		(E.runLists [] $ E.catchError
 			(E.throwError (Exc.ErrorCall "error"))
@@ -41,7 +41,7 @@
 
 test_NotDivergent :: Suite
 test_NotDivergent = assertions "not-divergent" $ do
-	$expect $ equalExc
+	$expect $ equalError
 		(Exc.ErrorCall "require: Unexpected EOF")
 		(E.runLists [] $ E.catchError
 			(do
diff --git a/tests/EnumeratorTests/Join.hs b/tests/EnumeratorTests/Join.hs
index 0973cbc..fa0ceb6 100644
--- a/tests/EnumeratorTests/Join.hs
+++ b/tests/EnumeratorTests/Join.hs
@@ -20,7 +20,7 @@
 import qualified Data.Enumerator as E
 import qualified Data.Enumerator.List as EL
 
-import           EnumeratorTests.Util (equalExc)
+import           EnumeratorTests.Util (equalError, throwsError)
 
 test_JoinE :: Suite
 test_JoinE = suite "joinE"
@@ -42,7 +42,7 @@
 	let enum :: Monad m => E.Enumerator Char m b
 	    enum = E.joinE (E.enumLists [['A', 'B', 'C']]) (E.sequence (E.throwError (ErrorCall "foo")))
 	
-	$expect $ equalExc
+	$expect $ equalError
 		(ErrorCall "foo")
 		(runIdentity (E.run (enum $$ EL.consume)))
 
@@ -53,7 +53,7 @@
 	let diverg :: Monad m => E.Iteratee a m b
 	    diverg = E.continue (\_ -> diverg)
 	
-	$expect $ throwsEq
+	$expect $ throwsError
 		(ErrorCall "enumEOF: divergent iteratee")
 		(E.run_ (enum $$ diverg))
 
@@ -68,10 +68,10 @@
 	$expect $ equal
 		['a', 'b', 'c']
 		(runIdentity (E.run_ (enum $$ E.joinI (EL.map toLower $$ EL.consume))))
-	$expect $ equalExc
+	$expect $ equalError
 		(ErrorCall "foo")
 		(runIdentity (E.run (enum $$ E.joinI (EL.map toLower $$ E.throwError (ErrorCall "foo")))))
-	$expect $ throwsEq
+	$expect $ throwsError
 		(ErrorCall "joinI: divergent iteratee")
 		(E.run_ (enum $$ E.joinI (EL.map toLower $$ diverg)))
 
diff --git a/tests/EnumeratorTests/List/Consume.hs b/tests/EnumeratorTests/List/Consume.hs
index 5e6abce..d0410a3 100644
--- a/tests/EnumeratorTests/List/Consume.hs
+++ b/tests/EnumeratorTests/List/Consume.hs
@@ -18,7 +18,7 @@
 import qualified Data.Enumerator as E
 import qualified Data.Enumerator.List as EL
 
-import           EnumeratorTests.Util (equalExc)
+import           EnumeratorTests.Util (equalError)
 
 test_Consume :: Suite
 test_Consume = assertions "consume" $ do
@@ -52,7 +52,7 @@
 			x <- EL.head_
 			extra <- EL.consume
 			return (x, extra))
-	$expect $ equalExc
+	$expect $ equalError
 		(ErrorCall "head_: stream has ended")
 		(E.runLists [] $ do
 			x <- EL.head_
diff --git a/tests/EnumeratorTests/List/Fold.hs b/tests/EnumeratorTests/List/Fold.hs
index c3a946f..c5b7795 100644
--- a/tests/EnumeratorTests/List/Fold.hs
+++ b/tests/EnumeratorTests/List/Fold.hs
@@ -22,6 +22,7 @@
 import           Data.Enumerator (($$))
 import qualified Data.Enumerator.List as EL
 
+import           EnumeratorTests.Util (throwsError)
 import           EnumeratorTests.List.Util ()
 
 test_Fold :: Suite
@@ -42,8 +43,8 @@
 	let step _ x = case x of
 		'C' -> Exception.throw exc
 		_ -> 'a'
-	$expect $ throwsEq exc (E.run_ (E.enumList 1 ['A', 'B', 'C'] $$ EL.fold step 'a'))
-	$expect $ throwsEq exc (E.run_ (E.enumList 3 ['A', 'B', 'C'] $$ EL.fold step 'a'))
+	$expect $ throwsError exc (E.run_ (E.enumList 1 ['A', 'B', 'C'] $$ EL.fold step 'a'))
+	$expect $ throwsError exc (E.run_ (E.enumList 3 ['A', 'B', 'C'] $$ EL.fold step 'a'))
 
 test_Fold_EOF :: Suite
 test_Fold_EOF = assertions "eof" $ do
diff --git a/tests/EnumeratorTests/List/Require.hs b/tests/EnumeratorTests/List/Require.hs
index c0d4b93..7c3b3f2 100644
--- a/tests/EnumeratorTests/List/Require.hs
+++ b/tests/EnumeratorTests/List/Require.hs
@@ -16,7 +16,7 @@
 import qualified Data.Enumerator.List as EL
 
 import           EnumeratorTests.List.Util (prop_ListN)
-import           EnumeratorTests.Util (equalExc)
+import           EnumeratorTests.Util (equalError)
 
 test_Require :: Suite
 test_Require = suite "require"
@@ -50,7 +50,7 @@
 
 test_HandleEOF :: Suite
 test_HandleEOF = assertions "handle-eof" $ do
-	$expect $ equalExc
+	$expect $ equalError
 		(Exc.ErrorCall "require: Unexpected EOF")
 		(E.runLists [] $ do
 			EL.require 2
diff --git a/tests/EnumeratorTests/List/Zip.hs b/tests/EnumeratorTests/List/Zip.hs
index 7930cd0..a462b1a 100644
--- a/tests/EnumeratorTests/List/Zip.hs
+++ b/tests/EnumeratorTests/List/Zip.hs
@@ -17,7 +17,7 @@
 import qualified Data.Enumerator.List as EL
 
 import           EnumeratorTests.List.Util ()
-import           EnumeratorTests.Util (equalExc)
+import           EnumeratorTests.Util (equalError)
 
 test_ZipN :: (Eq b, Show b) => Text -> E.Iteratee Char Identity b -> b -> Suite
 test_ZipN name iter expected = assertions name $ do
@@ -87,14 +87,14 @@
 
 test_ErrorFirst :: Suite
 test_ErrorFirst = assertions "error-first" $ do
-	$expect $ equalExc
+	$expect $ equalError
 		(Exc.ErrorCall "error")
 		(E.runLists [['A'], ['B'], ['C']] $ do
 			EL.zip (E.throwError (Exc.ErrorCall "error")) (EL.take 1))
 
 test_ErrorSecond :: Suite
 test_ErrorSecond = assertions "error-second" $ do
-	$expect $ equalExc
+	$expect $ equalError
 		(Exc.ErrorCall "error")
 		(E.runLists [['A'], ['B'], ['C']] $ do
 			EL.zip (EL.take 1) (E.throwError (Exc.ErrorCall "error")))
diff --git a/tests/EnumeratorTests/Misc.hs b/tests/EnumeratorTests/Misc.hs
index 979459d..ab6d579 100644
--- a/tests/EnumeratorTests/Misc.hs
+++ b/tests/EnumeratorTests/Misc.hs
@@ -32,7 +32,7 @@
 import qualified Data.Enumerator as E
 import qualified Data.Enumerator.List as EL
 
-import           EnumeratorTests.Util (equalExc)
+import           EnumeratorTests.Util (equalError, throwsError)
 
 test_ConcatEnums :: Suite
 test_ConcatEnums = assertions "concatEnums" $ do
@@ -52,7 +52,7 @@
 test_EnumEOF = assertions "enumEOF" $ do
 	let iter = E.continue (\_ -> iter)
 	
-	$expect $ throwsEq
+	$expect $ throwsError
 		(ErrorCall "enumEOF: divergent iteratee")
 		(E.runIteratee (E.enumEOF $$ iter))
 
@@ -92,7 +92,7 @@
 		(Just 'A', ['B', 'C', 'D', 'E'])
 		(runIdentity (runReaderT (E.run_ (E.enumList 1 ['A'..'E'] $$ iter2 False)) 0))
 	
-	$expect $ equalExc
+	$expect $ equalError
 		(ErrorCall "failed")
 		(runIdentity (runReaderT (E.run (E.enumList 1 ['A'..'E'] $$ iter2 True)) 0))
 
@@ -127,7 +127,7 @@
 	
 	do
 		res <- E.run (E.tryIO (throwIO (ErrorCall "failed")))
-		$expect (equalExc (ErrorCall "failed") res)
+		$expect (equalError (ErrorCall "failed") res)
 
 test_PrintChunks :: Suite
 #ifdef MIN_VERSION_silently
diff --git a/tests/EnumeratorTests/Text/Codecs.hs b/tests/EnumeratorTests/Text/Codecs.hs
index ccb6ad9..f8acd74 100644
--- a/tests/EnumeratorTests/Text/Codecs.hs
+++ b/tests/EnumeratorTests/Text/Codecs.hs
@@ -54,12 +54,12 @@
 	  		(show ET.ascii)
 	
 	, assertions "encode-invalid" $ do
-	  	$expect $ equalExc
+	  	$expect $ equalError
 	  		(ErrorCall "Codec \"ASCII\" can't encode character U+00FF")
 	  		(E.runLists [["\xFF"]] (ET.encode ET.ascii =$ EB.consume))
 	
 	, assertions "decode-invalid" $ do
-	  	$expect $ equalExc
+	  	$expect $ equalError
 	  		(ErrorCall "Codec \"ASCII\" can't decode byte 0xFF")
 	  		(E.runLists [["\xFF"]] (ET.decode ET.ascii =$ ET.consume))
 	
@@ -119,7 +119,7 @@
 	  		(show ET.iso8859_1)
 	
 	, assertions "encode-invalid" $ do
-	  	$expect $ equalExc
+	  	$expect $ equalError
 	  		(ErrorCall "Codec \"ISO-8859-1\" can't encode character U+01FF")
 	  		(E.runLists [["\x1FF"]] (ET.encode ET.iso8859_1 =$ EB.consume))
 	
@@ -166,7 +166,7 @@
 	  	$expect $ equalExc
 	  		(TE.DecodeError "Data.Text.Encoding.decodeUtf8: Invalid UTF-8 stream" (Just 0xFF))
 	  		(E.runLists [["\xFF"]] (ET.decode ET.utf8 =$ ET.consume))
-	  	$expect $ equalExc
+	  	$expect $ equalError
 	  		(ErrorCall "Unexpected EOF while decoding")
 	  		(E.runLists [["\xF0"]] (ET.decode ET.utf8 =$ ET.consume))
 	
@@ -193,7 +193,7 @@
 	  	$expect $ equalExc
 	  		(TE.DecodeError "Data.Text.Encoding.Fusion.streamUtf16BE: Invalid UTF-16BE stream" Nothing)
 	  		(E.runLists [["\xDD\x1E"]] (ET.decode ET.utf16_be =$ ET.consume))
-	  	$expect $ equalExc
+	  	$expect $ equalError
 	  		(ErrorCall "Unexpected EOF while decoding")
 	  		(E.runLists [["\xD8\x00"]] (ET.decode ET.utf16_be =$ ET.consume))
 	
@@ -226,7 +226,7 @@
 	  	$expect $ equalExc
 	  		(TE.DecodeError "Data.Text.Encoding.Fusion.streamUtf16LE: Invalid UTF-16LE stream" Nothing)
 	  		(E.runLists [["\x1E\xDD"]] (ET.decode ET.utf16_le =$ ET.consume))
-	  	$expect $ equalExc
+	  	$expect $ equalError
 	  		(ErrorCall "Unexpected EOF while decoding")
 	  		(E.runLists [["\x00\xD8"]] (ET.decode ET.utf16_le =$ ET.consume))
 	
@@ -259,7 +259,7 @@
 	  	$expect $ equalExc
 	  		(TE.DecodeError "Data.Text.Encoding.Fusion.streamUtf32BE: Invalid UTF-32BE stream" Nothing)
 	  		(E.runLists [["\xFF\xFF\xFF\xFF"]] (ET.decode ET.utf32_be =$ ET.consume))
-	  	$expect $ equalExc
+	  	$expect $ equalError
 	  		(ErrorCall "Unexpected EOF while decoding")
 	  		(E.runLists [["\x00\x00"]] (ET.decode ET.utf32_be =$ ET.consume))
 	
@@ -292,7 +292,7 @@
 	  	$expect $ equalExc
 	  		(TE.DecodeError "Data.Text.Encoding.Fusion.streamUtf32LE: Invalid UTF-32LE stream" Nothing)
 	  		(E.runLists [["\xFF\xFF\xFF\xFF"]] (ET.decode ET.utf32_le =$ ET.consume))
-	  	$expect $ equalExc
+	  	$expect $ equalError
 	  		(ErrorCall "Unexpected EOF while decoding")
 	  		(E.runLists [["\x00\x00"]] (ET.decode ET.utf32_le =$ ET.consume))
 	
diff --git a/tests/EnumeratorTests/Text/Consume.hs b/tests/EnumeratorTests/Text/Consume.hs
index 6558758..3eb9bf4 100644
--- a/tests/EnumeratorTests/Text/Consume.hs
+++ b/tests/EnumeratorTests/Text/Consume.hs
@@ -19,7 +19,7 @@
 import qualified Data.Enumerator.List as EL
 import qualified Data.Enumerator.Text as ET
 
-import           EnumeratorTests.Util (equalExc)
+import           EnumeratorTests.Util (equalError)
 
 test_Consume :: Suite
 test_Consume = assertions "consume" $ do
@@ -53,7 +53,7 @@
 			x <- ET.head_
 			extra <- EL.consume
 			return (x, extra))
-	$expect $ equalExc
+	$expect $ equalError
 		(ErrorCall "head_: stream has ended")
 		(E.runLists [] $ do
 			x <- ET.head_
diff --git a/tests/EnumeratorTests/Text/Require.hs b/tests/EnumeratorTests/Text/Require.hs
index 8201115..5fa6181 100644
--- a/tests/EnumeratorTests/Text/Require.hs
+++ b/tests/EnumeratorTests/Text/Require.hs
@@ -18,7 +18,7 @@
 import qualified Data.Enumerator.Text as ET
 
 import           EnumeratorTests.Text.Util
-import           EnumeratorTests.Util (equalExc)
+import           EnumeratorTests.Util (equalError)
 
 test_Require :: Suite
 test_Require = suite "require"
@@ -52,7 +52,7 @@
 
 test_HandleEOF :: Suite
 test_HandleEOF = assertions "handle-eof" $ do
-	$expect $ equalExc
+	$expect $ equalError
 		(Exc.ErrorCall "require: Unexpected EOF")
 		(E.runLists [] $ do
 			ET.require 2
diff --git a/tests/EnumeratorTests/Text/Zip.hs b/tests/EnumeratorTests/Text/Zip.hs
index 7337d59..69ef606 100644
--- a/tests/EnumeratorTests/Text/Zip.hs
+++ b/tests/EnumeratorTests/Text/Zip.hs
@@ -17,7 +17,7 @@
 import qualified Data.Enumerator.List as EL
 import qualified Data.Enumerator.Text as ET
 
-import           EnumeratorTests.Util (equalExc)
+import           EnumeratorTests.Util (equalError)
 
 test_ZipN :: (Eq b, Show b) => Text -> E.Iteratee Text Identity b -> b -> Suite
 test_ZipN name iter expected = assertions name $ do
@@ -87,14 +87,14 @@
 
 test_ErrorFirst :: Suite
 test_ErrorFirst = assertions "error-first" $ do
-	$expect $ equalExc
+	$expect $ equalError
 		(Exc.ErrorCall "error")
 		(E.runLists [["A"], ["B"], ["C"]] $ do
 			ET.zip (E.throwError (Exc.ErrorCall "error")) (ET.take 1))
 
 test_ErrorSecond :: Suite
 test_ErrorSecond = assertions "error-second" $ do
-	$expect $ equalExc
+	$expect $ equalError
 		(Exc.ErrorCall "error")
 		(E.runLists [["A"], ["B"], ["C"]] $ do
 			ET.zip (ET.take 1) (E.throwError (Exc.ErrorCall "error")))
diff --git a/tests/EnumeratorTests/Trans.hs b/tests/EnumeratorTests/Trans.hs
index b4a6fea..73d6188 100644
--- a/tests/EnumeratorTests/Trans.hs
+++ b/tests/EnumeratorTests/Trans.hs
@@ -26,7 +26,7 @@
 import qualified Data.Enumerator.List as EL
 import qualified Data.Enumerator.Trans as ET
 
-import           EnumeratorTests.Util (equalExc)
+import           EnumeratorTests.Util (equalError)
 
 test_Trans :: Suite
 test_Trans = suite "transformers"
@@ -51,7 +51,7 @@
 			x <- ET.runIdentityI (EL.take 1)
 			extra <- EL.consume
 			return (x, extra))
-	$expect $ equalExc
+	$expect $ equalError
 		(ErrorCall "err")
 		(E.runLists [] $ ET.runIdentityI (E.throwError (ErrorCall "err")))
 
@@ -69,7 +69,7 @@
 			x <- ET.runMaybeI (lift mzero)
 			extra <- EL.consume
 			return (x, extra))
-	$expect $ equalExc
+	$expect $ equalError
 		(ErrorCall "err")
 		(E.runLists [] $ ET.runMaybeI (E.throwError (ErrorCall "err")))
 
@@ -87,7 +87,7 @@
 			x <- ET.runErrorI (lift (ErrorT.throwError "err"))
 			extra <- EL.consume
 			return (x, extra))
-	$expect $ equalExc
+	$expect $ equalError
 		(ErrorCall "err")
 		(E.runLists [] $ ET.runErrorI $ do
 			_ <- E.throwError (ErrorCall "err")
@@ -104,7 +104,7 @@
 				return (x, y)
 			extra <- EL.consume
 			return (xy, extra))
-	$expect $ equalExc
+	$expect $ equalError
 		(ErrorCall "err")
 		(E.runLists [] $ ET.runReaderI 'A' (E.throwError (ErrorCall "err")))
 
@@ -126,7 +126,7 @@
 				return (x, y)
 			extra <- EL.consume
 			return (xy, extra))
-	$expect $ equalExc
+	$expect $ equalError
 		(ErrorCall "err")
 		(E.runLists [] $ ET.runStateI 'A' (E.throwError (ErrorCall "err")))
 
@@ -142,7 +142,7 @@
 				return (x, y)
 			extra <- EL.consume
 			return (xy, extra))
-	$expect $ equalExc
+	$expect $ equalError
 		(ErrorCall "err")
 		(E.runLists [] $ ET.runStateI' 'A' (E.throwError (ErrorCall "err")))
 
@@ -196,7 +196,7 @@
 				return x
 			extra <- EL.consume
 			return (x, extra))
-	$expect $ equalExc
+	$expect $ equalError
 		(ErrorCall "err")
 		(E.runLists [] $ ET.runWriterI $ do
 			_ <- E.throwError (ErrorCall "err")
@@ -214,7 +214,7 @@
 				return x
 			extra <- EL.consume
 			return (x, extra))
-	$expect $ equalExc
+	$expect $ equalError
 		(ErrorCall "err")
 		(E.runLists [] $ ET.runWriterI' $ do
 			_ <- E.throwError (ErrorCall "err")
@@ -272,7 +272,7 @@
 				return (x, y)
 			extra <- EL.consume
 			return (xy, extra))
-	$expect $ equalExc
+	$expect $ equalError
 		(ErrorCall "err")
 		(E.runLists [] $ ET.runRWSI 'A' 'A' $ do
 			_ <- E.throwError (ErrorCall "err")
@@ -292,7 +292,7 @@
 				return (x, y)
 			extra <- EL.consume
 			return (xy, extra))
-	$expect $ equalExc
+	$expect $ equalError
 		(ErrorCall "err")
 		(E.runLists [] $ ET.runRWSI' 'A' 'A' $ do
 			_ <- E.throwError (ErrorCall "err")
diff --git a/tests/EnumeratorTests/Util.hs b/tests/EnumeratorTests/Util.hs
index aeaba89..45c1451 100644
--- a/tests/EnumeratorTests/Util.hs
+++ b/tests/EnumeratorTests/Util.hs
@@ -6,6 +6,8 @@
 module EnumeratorTests.Util
 	( check
 	, equalExc
+	, equalError
+	, throwsError
 	, todo
 	, within
 	, genASCII
@@ -29,14 +31,22 @@
 import qualified Data.Enumerator as E
 
 check :: Eq b => E.Iteratee a Identity b -> ([a] -> Either Exc.ErrorCall b) -> [a] -> Bool
-check iter plain xs = expected == run where
-	expected = case plain xs of
-		Left exc -> Left (Just exc)
-		Right x -> Right x
-	
+check iter plain xs = check' where
 	run = case runIdentity (E.run (E.enumList 1 xs $$ iter)) of
 		Left exc -> Left (Exc.fromException exc)
 		Right x -> Right x
+	
+	check' = case plain xs of
+		Left err1 -> case run of
+			Right _ -> False
+			Left Nothing -> False
+			Left (Just err2) -> eqError err1 err2
+		Right x -> case run of
+			Right y -> x == y
+			Left _ -> False
+
+eqError :: Exc.ErrorCall -> Exc.ErrorCall -> Bool
+eqError (Exc.ErrorCall s1) (Exc.ErrorCall s2) = s1 == s2
 
 todo :: T.Text -> Suite
 todo name = skipIf True (assertions name (return ()))
@@ -117,9 +127,6 @@
 instance Arbitrary B.ByteString where
 	arbitrary = genUnicode
 
-instance Eq Exc.ErrorCall where
-	(Exc.ErrorCall s1) == (Exc.ErrorCall s2) = s1 == s2
-
 -- | Require a test to complete within /n/ milliseconds.
 within :: Int -> Suite -> Suite
 within time s = suite (suiteName s) (map wrapTest (suiteTests s)) where
@@ -140,3 +147,18 @@
 			Just exc' -> if expected == exc'
 				then AssertionPassed
 				else failed (show expected ++ " /= " ++ show exc')
+
+equalError :: Exc.ErrorCall -> Either Exc.SomeException a -> Assertion
+equalError expected funResult = Assertion (return result) where
+	failed :: String -> AssertionResult
+	failed str = AssertionFailed (T.pack ("equalError: " ++ show str))
+	result = case funResult of
+		Right _ -> failed "received Right"
+		Left exc -> case Exc.fromException exc of
+			Nothing -> failed ("received unexpected exception: " ++ show exc)
+			Just exc' -> if eqError expected exc'
+				then AssertionPassed
+				else failed (show expected ++ " /= " ++ show exc')
+
+throwsError :: Exc.ErrorCall -> IO a -> Assertion
+throwsError err = throws (eqError err)