diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2013-2014, Evan Czaplicki
+Copyright (c) 2013-2015, Evan Czaplicki
 
 All rights reserved.
 
diff --git a/elm-package.cabal b/elm-package.cabal
--- a/elm-package.cabal
+++ b/elm-package.cabal
@@ -1,5 +1,5 @@
 Name: elm-package
-Version: 0.2.2
+Version: 0.4
 
 Synopsis:
     Package manager for Elm libraries
@@ -63,7 +63,7 @@
         containers >= 0.3 && < 0.6,
         bytestring >= 0.9 && < 0.11,
         directory >= 1.0 && < 2.0,
-        elm-compiler >= 0.14 && < 0.15,
+        elm-compiler >= 0.14.1 && < 0.15,
         filepath >= 1 && < 2.0,
         HTTP >= 4000.2.5 && < 4000.3,
         http-client >= 0.3 && < 0.5,
@@ -133,7 +133,7 @@
         http-types >= 0.7 && < 0.9,
         mtl >= 2 && < 3,
         network >= 2.4 && < 2.7,
-        optparse-applicative >= 0.11 && < 0.12,
+        optparse-applicative >= 0.8.1 && < 0.11,
         pretty,
         process >= 1 && < 2,
         text,
diff --git a/src/Bump.hs b/src/Bump.hs
--- a/src/Bump.hs
+++ b/src/Bump.hs
@@ -29,23 +29,25 @@
                 validateInitialVersion description
 
             Just publishedVersions ->
-                let bumps = map (\(old, _, _) -> old) (validBumps publishedVersions) in
-                if statedVersion `elem` bumps
+                let baseVersions = map (\(old, _, _) -> old) (validBumps publishedVersions) in
+                if statedVersion `elem` baseVersions
                     then suggestVersion newDocs name statedVersion description
-                    else throwError (unbumpable bumps)
+                    else throwError (unbumpable baseVersions)
 
         return ()
 
 
 unbumpable :: [V.Version] -> String
-unbumpable validBumps =
+unbumpable baseVersions =
+  let versions = map head (List.group (List.sort baseVersions))
+  in
     unlines
     [ "To bump you must start with an already published version number in"
     , Path.description ++ ", giving us a starting point to bump from."
     , ""
     , "The version numbers that can be bumped include the following subset of"
     , "published versions:"
-    , "  " ++ List.intercalate ", " (map V.toString validBumps)
+    , "  " ++ List.intercalate ", " (map V.toString versions)
     , ""
     , "Switch back to one of these versions before running 'elm-package bump'"
     , "again."
@@ -214,5 +216,5 @@
   where
     patchPoints = V.filterLatest V.majorAndMinor publishedVersions
     minorPoints = V.filterLatest V.major publishedVersions
-    majorPoint = last publishedVersions
+    majorPoint = head publishedVersions
 
diff --git a/src/CommandLine/Arguments.hs b/src/CommandLine/Arguments.hs
--- a/src/CommandLine/Arguments.hs
+++ b/src/CommandLine/Arguments.hs
@@ -1,9 +1,7 @@
 module CommandLine.Arguments (parse) where
 
 import Control.Applicative (pure, optional, (<$>), (<*>), (<|>))
-import Control.Monad (mzero)
 import Control.Monad.Error (throwError)
-import Control.Monad.Reader.Class (ask)
 import Data.Monoid ((<>), mconcat, mempty)
 import Data.Version (showVersion)
 import qualified Options.Applicative as Opt
@@ -162,14 +160,9 @@
 
 -- ARGUMENT PARSERS
 
-mkParser :: (String -> Maybe a) -> Opt.ReadM a
-mkParser p =
-  do  s <- Opt.str
-      maybe mzero return . p $ s
-
 package :: Opt.Parser N.Name
 package =
-    Opt.argument (mkParser N.fromString) $
+    Opt.argument N.fromString $
         mconcat
         [ Opt.metavar "PACKAGE"
         , Opt.help "A specific package name (e.g. evancz/automaton)"
@@ -177,7 +170,7 @@
 
 version :: Opt.Parser V.Version
 version =
-    Opt.argument (mkParser V.fromString) $
+    Opt.argument V.fromString $
         mconcat
         [ Opt.metavar "VERSION"
         , Opt.help "Specific version of a package (e.g. 1.2.0)"
diff --git a/src/Elm/Package/Name.hs b/src/Elm/Package/Name.hs
--- a/src/Elm/Package/Name.hs
+++ b/src/Elm/Package/Name.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE FlexibleContexts #-}
 module Elm.Package.Name where
 
 import Control.Applicative ((<$>), (<*>))
@@ -44,7 +45,7 @@
       _ -> Nothing
 
 
-fromString' :: String -> ErrorT String IO Name
+fromString' :: (MonadError String m) => String -> m Name
 fromString' string =
     Maybe.maybe (throwError $ errorMsg string) return (fromString string)
 
