diff --git a/CHANGES.markdown b/CHANGES.markdown
--- a/CHANGES.markdown
+++ b/CHANGES.markdown
@@ -1,12 +1,17 @@
+1.2.0.4 (8 October 2014)
+------------------------
+
+- Allow and require `optparse-applicative-0.11`
+
 1.2.0.3 (7 September 2014)
 --------------------------
 
-- Allow optparse-applicative-0.10
+- Allow `optparse-applicative-0.10`
 
 1.2.0.2 (22 August 2014)
 ------------------------
 
-- Allow lens-4.4
+- Allow `lens-4.4`
 
 1.2.0.1 (4 June 2014)
 ---------------------
diff --git a/diagrams-lib.cabal b/diagrams-lib.cabal
--- a/diagrams-lib.cabal
+++ b/diagrams-lib.cabal
@@ -1,5 +1,5 @@
 Name:                diagrams-lib
-Version:             1.2.0.3
+Version:             1.2.0.4
 Synopsis:            Embedded domain-specific language for declarative graphics
 Description:         Diagrams is a flexible, extensible EDSL for creating
                      graphics of many types.  Graphics can be created
@@ -107,9 +107,8 @@
                        intervals >= 0.7 && < 0.8,
                        lens >= 4.0 && < 4.5,
                        tagged >= 0.7,
-                       optparse-applicative >= 0.10 && < 0.11,
+                       optparse-applicative >= 0.11 && < 0.12,
                        filepath,
-                       safe >= 0.2 && < 0.4,
                        JuicyPixels >= 3.1.5 && < 3.2,
                        hashable >= 1.1 && < 1.3
   if impl(ghc < 7.6)
diff --git a/src/Diagrams/Backend/CmdLine.hs b/src/Diagrams/Backend/CmdLine.hs
--- a/src/Diagrams/Backend/CmdLine.hs
+++ b/src/Diagrams/Backend/CmdLine.hs
@@ -77,6 +77,7 @@
 import           Diagrams.Core       hiding (value)
 
 import           Options.Applicative
+import           Options.Applicative.Types (readerAsk)
 
 import           Prelude
 
@@ -93,8 +94,6 @@
 
 import           Numeric
 
-import           Safe                (readMay)
-
 import           System.Environment  (getProgName)
 import           System.FilePath     (addExtension, splitExtension)
 
@@ -232,19 +231,19 @@
 -- certainly want the latter.  So we need to have less Read instances.
 --
 -- instance Read a => Parseable a where
---    parser = argument readMay mempty
+--    parser = argument auto mempty
 
 -- | Parse 'Int' according to its 'Read' instance.
 instance Parseable Int where
-    parser = argument readMay mempty
+    parser = argument auto mempty
 
 -- | Parse 'Double' according to its 'Read' instance.
 instance Parseable Double where
-    parser = argument readMay mempty
+    parser = argument auto mempty
 
 -- | Parse a string by just accepting the given string.
 instance Parseable String where
-    parser = argument Just mempty
+    parser = argument str mempty
 
 -- | Parse 'DiagramOpts' using the 'diagramOpts' parser.
 instance Parseable DiagramOpts where
@@ -266,20 +265,21 @@
 -- | Parse @'Colour' Double@ as either a named color from "Data.Colour.Names"
 --   or a hexadecimal color.
 instance Parseable (Colour Double) where
-    parser = argument (liftA2 (<|>) rc rh) mempty
+    parser = argument (rc <|> rh) mempty
       where
-        rh s = (f . colorToSRGBA) <$> readHexColor s
-        rc s = readColourName s
+        rh, rc :: ReadM (Colour Double)
+        rh = f . colorToSRGBA <$> (readerAsk >>= readHexColor)
+        rc = readerAsk >>= readColourName
         f (r,g,b,_) = sRGB r g b -- TODO: this seems unfortunate.  Should the alpha
                                  -- value be applied to the r g b values?
 
 -- | Parse @'AlphaColour' Double@ as either a named color from "Data.Colour.Names"
 --   or a hexadecimal color.
 instance Parseable (AlphaColour Double) where
-    parser = argument (liftA2 (<|>) rc rh) mempty
+    parser = argument (rc <|> rh) mempty
       where
-        rh s = readHexColor s
-        rc s = opaque <$> readColourName s
+        rh = readerAsk >>= readHexColor
+        rc = opaque <$> (readerAsk >>= readColourName)
 
 -- Addapted from the Clay.Color module of the clay package
 
@@ -289,7 +289,7 @@
 --   example, @\"0xfc4\"@ is the same as @\"0xffcc44\"@.  When eight or six
 --   digits are given each pair of digits is a color or alpha channel with the
 --   order being red, green, blue, alpha.
-readHexColor :: String -> Maybe (AlphaColour Double)
+readHexColor :: (Applicative m, Monad m) => String -> m (AlphaColour Double)
 readHexColor cs = case cs of
      ('0':'x':hs) -> handle hs
      ('#':hs)     -> handle hs
@@ -301,14 +301,14 @@
         [a,b,c,d,e,f    ] -> opaque      <$> (sRGB <$> hex a b <*> hex c d <*> hex e f)
         [a,b,c,d        ] -> withOpacity <$> (sRGB <$> hex a a <*> hex b b <*> hex c c) <*> hex d d
         [a,b,c          ] -> opaque      <$> (sRGB <$> hex a a <*> hex b b <*> hex c c)
-        _                 -> Nothing
-    handle _ = Nothing
+        _                 -> fail $ "could not parse as a colour" ++ cs
+    handle _ = fail $ "could not parse as a colour: " ++ cs
 
     isHexDigit c = isDigit c|| c `elem` "abcdef"
 
     hex a b = (/ 255) <$> case readHex [a,b] of
-                [(h,"")] -> Just h
-                _        -> Nothing
+                [(h,"")] -> return h
+                _        -> fail $ "could not parse as a hex value" ++ (a:b:[])
 
 
 -- | This instance is needed to signal the end of a chain of
