   end
 
   # Handles -a, -abc, -abc=something
-  defp next(["-" <> option = original | rest] = argv, aliases, switches, strict?) do
+  defp next(["-" <> option | rest] = argv, aliases, switches, strict?) do
     {option, value} = split_option(option)
-    original_option = "-" <> option
+    original = "-" <> option
 
     cond do
-      negative_number?(original) ->
+      is_nil(value) and negative_number?(original) ->
         {:error, argv}
       String.contains?(option, ["-", "_"]) ->
-        {:undefined, original_option, value, rest}
+        {:undefined, original, value, rest}
       String.length(option) > 1 ->
         opt = get_option(option)
         alias = aliases[opt]
         if opt && alias do
           IO.warn "multi-letter aliases are deprecated, got: #{inspect(opt)}"
-          do_next({:default, alias}, value, original_option, rest, switches, strict?)
+          do_next({:default, alias}, value, original, rest, switches, strict?)
         else
           next(expand_multiletter_alias(option, value) ++ rest, aliases, switches, strict?)
         end
       true ->
         # We have a regular one-letter alias here
-        tagged = tag_single_letter_alias(option, aliases)
-        do_next(tagged, value, original_option, rest, switches, strict?)
+        tagged = tag_oneletter_alias(option, aliases)
+        do_next(tagged, value, original, rest, switches, strict?)
     end
   end
 

    {switches, strict?} = cond do
      opts[:switches] && opts[:strict] ->
        raise ArgumentError, ":switches and :strict cannot be given together"
      s = opts[:switches] ->
        {s, false}
      s = opts[:strict] ->
        {s, true}
      true ->
        {[], false}
    end

    end
  end

  defp store_option(dict, option, value, kinds) do
    cond do
      :count in kinds ->
        Keyword.update(dict, option, value, & &1 + 1)
