diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -33,7 +33,7 @@
 Instead I wrote 37 lines of cabal file, a similar number of lines of README,
 created a git repository, created a travis file, run travis to figure out on
 what versions it builds (something that would have happened automatically with
-a pull request for tasty), upload to hackge, add to stackage.
+a pull request for tasty), upload to hackage, add to stackage.
 
 Furthermore, there is little discoverability: If it were part of the tasty API,
 users would stumble over it. Now they likely won’t. And if they do, they have
diff --git a/Test/Tasty/ExpectedFailure.hs b/Test/Tasty/ExpectedFailure.hs
--- a/Test/Tasty/ExpectedFailure.hs
+++ b/Test/Tasty/ExpectedFailure.hs
@@ -1,11 +1,13 @@
 {-# LANGUAGE DeriveDataTypeable, ScopedTypeVariables #-}
-module Test.Tasty.ExpectedFailure (expectFail, ignoreTest, wrapTest) where
+module Test.Tasty.ExpectedFailure (expectFail, expectFailBecause, ignoreTest, ignoreTestBecause, wrapTest) where
 
 import Test.Tasty.Options
 import Test.Tasty.Runners
 import Test.Tasty.Providers
 import Data.Typeable
 import Data.Tagged
+import Data.Maybe
+import Data.Monoid
 
 data WrappedTest t = WrappedTest (IO Result -> IO Result) t
     deriving Typeable
@@ -14,7 +16,7 @@
     run opts (WrappedTest wrap t) prog = wrap (run opts t prog)
     testOptions = retag (testOptions :: Tagged t [OptionDescription])
 
--- | 'wrapTest' allows you to modify the behavoiur of the tests, e.g. by
+-- | 'wrapTest' allows you to modify the behaviour of the tests, e.g. by
 -- modifying the result or not running the test at all. It is used to implement
 -- 'expectFail' and 'ignoreTest'.
 wrapTest :: (IO Result -> IO Result) -> TestTree -> TestTree
@@ -42,28 +44,54 @@
 -- accidentially), the test suite will remind you to remove the 'expectFail'
 -- marker.
 expectFail :: TestTree -> TestTree
-expectFail = wrapTest (fmap change)
+expectFail = expectFail' Nothing
+
+-- | Like 'expectFail' but with additional comment
+expectFailBecause :: String -> TestTree -> TestTree
+expectFailBecause reason = expectFail' (Just reason)
+
+expectFail' :: Maybe String -> TestTree -> TestTree
+expectFail' reason = wrapTest (fmap change)
   where
     change r
         | resultSuccessful r
         = r { resultOutcome = Failure TestFailed
-            , resultDescription = resultDescription r `append` "(unexpected success)"
-            , resultShortDescription = "PASS (unexpected)"
+            , resultDescription = resultDescription r <> "(unexpected success" <> comment <> ")"
+            , resultShortDescription = "PASS (unexpected" <> comment <> ")"
             }
         | otherwise
         = r { resultOutcome = Success
-            , resultDescription = resultDescription r `append` "(expected failure)"
-            , resultShortDescription = "FAIL (expected)"
+            , resultDescription = resultDescription r <> "(expected failure)"
+            , resultShortDescription = "FAIL (expected" <> comment <> ")"
             }
     "" `append` s = s
     t  `append` s | last t == '\n' = t ++ s ++ "\n"
                   | otherwise      = t ++ "\n" ++ s
-
+    comment = maybe "" (mappend ": ") reason
 
--- | Prevents the tests from running and reports them as succeeding. This maybe
--- be desireable as an alternative comment the tests out, as they are still
--- typechecked, and the test report lists them, as a reminder that there are
--- ignored test.
+-- | Prevents the tests from running and reports them as succeeding.
+--
+-- This may be be desireable as an alternative to commenting out the tests. This
+-- way, they are still typechecked (preventing bitrot), and the test report
+-- lists them, which serves as a reminder that there are ignored tests.
+--
+-- Note that any setup/teardown actions executed by 'Test.Tasty.withResource'
+-- are still executed. You can bypass this manually as in the following example:
+--
+-- @
+-- askOption $ \\(MyFlag b) -> if b
+--                            then withResource mytest
+--                            else ignoreTest . mytest $ return junkvalue
+-- @
 ignoreTest :: TestTree -> TestTree
-ignoreTest = wrapTest $ const $ return $
-    (testPassed "") { resultShortDescription = "IGNORED" }
+ignoreTest = ignoreTest' Nothing
+
+-- | Like 'ignoreTest' but with additional comment
+ignoreTestBecause :: String -> TestTree -> TestTree
+ignoreTestBecause reason = ignoreTest' (Just reason)
+
+ignoreTest' :: Maybe String -> TestTree -> TestTree
+ignoreTest' reason = wrapTest $ const $ return $
+    (testPassed "") {
+      resultShortDescription = "IGNORED" <> maybe "" (mappend ": ") reason
+    }
diff --git a/tasty-expected-failure.cabal b/tasty-expected-failure.cabal
--- a/tasty-expected-failure.cabal
+++ b/tasty-expected-failure.cabal
@@ -1,5 +1,5 @@
 name:                tasty-expected-failure
-version:             0.11.0.4
+version:             0.11.1
 synopsis:            Mark tasty tests as failure expected
 description:
  With the function 'Test.Tasty.ExpectedFailure.expectFail' in the provided module
@@ -33,7 +33,7 @@
   exposed-modules:
     Test.Tasty.ExpectedFailure
   build-depends:
-    base >= 4.5 && <4.10,
+    base >= 4.5 && <4.11,
     tagged >= 0.7 && < 0.9,
     tasty >= 0.11
   default-language:    Haskell2010
