diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,11 @@
 Changes
 =======
 
+Version 0.11.1
+--------------
+
+Introduce `mkOptionCLParser` and `mkFlagCLParser`
+
 Version 0.11.0.4
 ----------------
 
diff --git a/Test/Tasty/Ingredients/ConsoleReporter.hs b/Test/Tasty/Ingredients/ConsoleReporter.hs
--- a/Test/Tasty/Ingredients/ConsoleReporter.hs
+++ b/Test/Tasty/Ingredients/ConsoleReporter.hs
@@ -334,7 +334,7 @@
   parseValue = fmap Quiet . safeRead
   optionName = return "quiet"
   optionHelp = return "Do not produce any output; indicate success only by the exit code"
-  optionCLParser = flagCLParser (Just 'q') (Quiet True)
+  optionCLParser = mkFlagCLParser (short 'q') (Quiet True)
 
 -- | Report only failed tests
 newtype HideSuccesses = HideSuccesses Bool
@@ -344,7 +344,7 @@
   parseValue = fmap HideSuccesses . safeRead
   optionName = return "hide-successes"
   optionHelp = return "Do not print tests that passed successfully"
-  optionCLParser = flagCLParser Nothing (HideSuccesses True)
+  optionCLParser = mkFlagCLParser mempty (HideSuccesses True)
 
 -- | When to use color on the output
 data UseColor
@@ -357,15 +357,6 @@
   parseValue = parseUseColor
   optionName = return "color"
   optionHelp = return "When to use colored output. Options are 'never', 'always' and 'auto' (default: 'auto')"
-  optionCLParser =
-    option parse
-      (  long name
-      <> help (untag (optionHelp :: Tagged UseColor String))
-      )
-    where
-      name = untag (optionName :: Tagged UseColor String)
-      parse = str >>=
-        maybe (readerError $ "Could not parse " ++ name) pure <$> parseValue
 
 -- | @useColor when isTerm@ decides if colors should be used,
 --   where @isTerm@ denotes where @stdout@ is a terminal device.
diff --git a/Test/Tasty/Ingredients/ListTests.hs b/Test/Tasty/Ingredients/ListTests.hs
--- a/Test/Tasty/Ingredients/ListTests.hs
+++ b/Test/Tasty/Ingredients/ListTests.hs
@@ -8,6 +8,8 @@
 
 import Data.Typeable
 import Data.Proxy
+import Data.Monoid
+import Options.Applicative
 
 import Test.Tasty.Core
 import Test.Tasty.Options
@@ -22,7 +24,7 @@
   parseValue = fmap ListTests . safeRead
   optionName = return "list-tests"
   optionHelp = return "Do not run the tests; just print their names"
-  optionCLParser = flagCLParser (Just 'l') (ListTests True)
+  optionCLParser = mkFlagCLParser (short 'l') (ListTests True)
 
 -- | Obtain the list of all tests in the suite
 testsNames :: OptionSet -> TestTree -> [TestName]
diff --git a/Test/Tasty/Options.hs b/Test/Tasty/Options.hs
--- a/Test/Tasty/Options.hs
+++ b/Test/Tasty/Options.hs
@@ -17,6 +17,8 @@
   , OptionDescription(..)
     -- * Utilities
   , flagCLParser
+  , mkFlagCLParser
+  , mkOptionCLParser
   , safeRead
   ) where
 
@@ -46,7 +48,9 @@
   -- | A command-line option parser.
   --
   -- It has a default implementation in terms of the other methods.
-  -- You may want to override it in some cases (e.g. add a short flag).
+  -- You may want to override it in some cases (e.g. add a short flag) and
+  -- 'flagCLParser', 'mkFlagCLParser' and 'mkOptionCLParser' might come in
+  -- handy.
   --
   -- Even if you override this, you still should implement all the methods
   -- above, to allow alternative interfaces.
@@ -62,16 +66,7 @@
   -- failing parser into an always-succeeding one that may return an empty
   -- OptionSet.)
   optionCLParser :: Parser v
-  optionCLParser =
-    option parse
-      (  long name
-      <> help helpString
-      )
-    where
-      name = untag (optionName :: Tagged v String)
-      helpString = untag (optionHelp :: Tagged v String)
-      parse = str >>=
-        maybe (readerError $ "Could not parse " ++ name) pure <$> parseValue
+  optionCLParser = mkOptionCLParser mempty
 
 
 data OptionValue = forall v . IsOption v => OptionValue v
@@ -119,11 +114,32 @@
   => Maybe Char -- ^ optional short flag
   -> v          -- ^ non-default value (when the flag is supplied)
   -> Parser v
-flagCLParser mbShort v = flag' v
-  (  foldMap short mbShort
-  <> long (untag (optionName :: Tagged v String))
+flagCLParser mbShort = mkFlagCLParser (foldMap short mbShort)
+
+-- | Command-line flag parser that takes additional option modifiers.
+mkFlagCLParser
+  :: forall v . IsOption v
+  => Mod FlagFields v -- ^ option modifier
+  -> v                -- ^ non-default value (when the flag is supplied)
+  -> Parser v
+mkFlagCLParser mod v = flag' v
+  (  long (untag (optionName :: Tagged v String))
   <> help (untag (optionHelp :: Tagged v String))
+  <> mod
   )
+
+-- | Command-line option parser that takes additional option modifiers.
+mkOptionCLParser :: forall v . IsOption v => Mod OptionFields v -> Parser v
+mkOptionCLParser mod =
+  option parse
+    (  long name
+    <> help (untag (optionHelp :: Tagged v String))
+    <> mod
+    )
+  where
+    name = untag (optionName :: Tagged v String)
+    parse = str >>=
+      maybe (readerError $ "Could not parse " ++ name) pure <$> parseValue
 
 -- | Safe read function. Defined here for convenience to use for
 -- 'parseValue'.
diff --git a/Test/Tasty/Options/Core.hs b/Test/Tasty/Options/Core.hs
--- a/Test/Tasty/Options/Core.hs
+++ b/Test/Tasty/Options/Core.hs
@@ -35,16 +35,7 @@
   parseValue = mfilter onlyPositive . fmap NumThreads . safeRead
   optionName = return "num-threads"
   optionHelp = return "Number of threads to use for tests execution"
-  optionCLParser =
-    option parse
-      (  short 'j'
-      <> long name
-      <> help (untag (optionHelp :: Tagged NumThreads String))
-      )
-    where
-      name = untag (optionName :: Tagged NumThreads String)
-      parse = str >>=
-        maybe (readerError $ "Could not parse " ++ name) pure <$> parseValue
+  optionCLParser = mkOptionCLParser (short 'j')
 
 -- | Filtering function to prevent non-positive number of threads
 onlyPositive :: NumThreads -> Bool
@@ -67,16 +58,7 @@
       <*> pure str
   optionName = return "timeout"
   optionHelp = return "Timeout for individual tests (suffixes: ms,s,m,h; default: s)"
-  optionCLParser =
-    option parse
-      (  short 't'
-      <> long name
-      <> help (untag (optionHelp :: Tagged Timeout String))
-      )
-    where
-      name = untag (optionName :: Tagged Timeout String)
-      parse = str >>=
-        maybe (readerError $ "Could not parse " ++ name) pure <$> parseValue
+  optionCLParser = mkOptionCLParser (short 't')
 
 parseTimeout :: String -> Maybe Integer
 parseTimeout str =
diff --git a/Test/Tasty/Patterns.hs b/Test/Tasty/Patterns.hs
--- a/Test/Tasty/Patterns.hs
+++ b/Test/Tasty/Patterns.hs
@@ -89,12 +89,7 @@
   parseValue = Just . parseTestPattern
   optionName = return "pattern"
   optionHelp = return "Select only tests that match pattern"
-  optionCLParser =
-    option (fmap parseTestPattern str)
-      (  short 'p'
-      <> long (untag (optionName :: Tagged TestPattern String))
-      <> help (untag (optionHelp :: Tagged TestPattern String))
-      )
+  optionCLParser = mkOptionCLParser (short 'p')
 
 -- | Parse a pattern
 parseTestPattern :: String -> TestPattern
diff --git a/tasty.cabal b/tasty.cabal
--- a/tasty.cabal
+++ b/tasty.cabal
@@ -2,7 +2,7 @@
 --  see http://haskell.org/cabal/users-guide/
 
 name:                tasty
-version:             0.11.0.4
+version:             0.11.1
 synopsis:            Modern and extensible testing framework
 description:         Tasty is a modern testing framework for Haskell.
                      It lets you combine your unit tests, golden
