diff --git a/click/core.py b/click/core.py
--- a/click/core.py
+++ b/click/core.py
@@ -1324,7 +1324,7 @@ def __init__(self, param_decls=None, type=None, required=False,
         self.is_eager = is_eager
         self.metavar = metavar
         self.envvar = envvar
-        self.autocompletion =  autocompletion
+        self.autocompletion = autocompletion
 
     @property
     def human_readable_name(self):
@@ -1355,7 +1355,6 @@ def get_default(self, ctx):
     def add_to_parser(self, parser, ctx):
         pass
 
-
     def consume_value(self, ctx, opts):
         value = opts.get(self.name)
         if value is None:
@@ -1805,11 +1804,9 @@ def _parse_decls(self, decls, expose_value):
         if len(decls) == 1:
             name = arg = decls[0]
             name = name.replace('-', '_').lower()
-        elif len(decls) == 2:
-            name, arg = decls
         else:
-            raise TypeError('Arguments take exactly one or two '
-                            'parameter declarations, got %d' % len(decls))
+            raise TypeError('Arguments take exactly one '
+                            'parameter declaration, got %d' % len(decls))
         return name, [arg], []
 
     def get_usage_pieces(self, ctx):

diff --git a/tests/test_arguments.py b/tests/test_arguments.py
--- a/tests/test_arguments.py
+++ b/tests/test_arguments.py
@@ -1,4 +1,5 @@
 # -*- coding: utf-8 -*-
+import pytest
 import click
 from click._compat import PY2
 
@@ -287,3 +288,11 @@ def cmd(a):
     result = runner.invoke(cmd, ['3'])
     assert result.exception is not None
     assert 'argument a takes 2 values' in result.output
+
+
+def test_multiple_param_decls_not_allowed(runner):
+    with pytest.raises(TypeError):
+        @click.command()
+        @click.argument('x', click.Choice(['a', 'b']))
+        def copy(x):
+            click.echo(x)

Validate *args passed to `click.option`
See https://github.com/pallets/click/issues/568

