diff --git a/cryptography/hazmat/primitives/asymmetric/ec.py b/cryptography/hazmat/primitives/asymmetric/ec.py
new file mode 100644
index 0000000..29ab67d
--- /dev/null
+++ b/cryptography/hazmat/primitives/asymmetric/ec.py
@@ -0,0 +1,69 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import absolute_import, division, print_function
+
+import six
+
+from cryptography.hazmat.primitives import interfaces
+
+
+class EllipticCurvePublicNumbers(object):
+    def __init__(self, x, y, curve):
+        if (
+            not isinstance(x, six.integer_types) or
+            not isinstance(y, six.integer_types)
+        ):
+            raise TypeError("x and y must be integers.")
+
+        if not isinstance(curve, interfaces.EllipticCurve):
+            raise TypeError("curve must provide the EllipticCurve interface.")
+
+        self._y = y
+        self._x = x
+        self._curve = curve
+
+    @property
+    def curve(self):
+        return self._curve
+
+    @property
+    def x(self):
+        return self._x
+
+    @property
+    def y(self):
+        return self._y
+
+
+class EllipticCurvePrivateNumbers(object):
+    def __init__(self, private_key, public_numbers):
+        if not isinstance(private_key, six.integer_types):
+            raise TypeError("private_key must be an integer.")
+
+        if not isinstance(public_numbers, EllipticCurvePublicNumbers):
+            raise TypeError(
+                "public_numbers must be an EllipticCurvePublicNumbers "
+                "instance."
+            )
+
+        self._private_key = private_key
+        self._public_numbers = public_numbers
+
+    @property
+    def private_key(self):
+        return self._private_key
+
+    @property
+    def public_numbers(self):
+        return self._public_numbers
diff --git a/cryptography/hazmat/primitives/interfaces.py b/cryptography/hazmat/primitives/interfaces.py
index 9ba9879..76d7e68 100644
--- a/cryptography/hazmat/primitives/interfaces.py
+++ b/cryptography/hazmat/primitives/interfaces.py
@@ -523,42 +523,18 @@
         Returns an AsymmetricSignatureContext used for signing data.
         """
 
-    @abc.abstractproperty
-    def curve(self):
-        """
-        The EllipticCurve that this key is on.
-        """
-
-    @abc.abstractproperty
-    def private_key(self):
-        """
-        The private value used for signing.
-        """
-
-    @abc.abstractproperty
-    def key_size(self):
-        """
-        The bit length of the base point of the curve.
-        """
-
-    @abc.abstractproperty
-    def x(self):
-        """
-        The affine x component of the public point used for verifying.
-        """
-
-    @abc.abstractproperty
-    def y(self):
-        """
-        The affine y component of the public point used for verifying.
-        """
-
     @abc.abstractmethod
     def public_key(self):
         """
         The EllipticCurvePublicKey for this private key.
         """
 
+    @abc.abstractproperty
+    def curve(self):
+        """
+        The EllipticCurve that this key is on.
+        """
+
 
 @six.add_metaclass(abc.ABCMeta)
 class EllipticCurvePublicKey(object):
@@ -573,21 +549,3 @@
         """
         The EllipticCurve that this key is on.
         """
-
-    @abc.abstractproperty
-    def x(self):
-        """
-        The affine x component of the public point used for verifying.
-        """
-
-    @abc.abstractproperty
-    def y(self):
-        """
-        The affine y component of the public point used for verifying.
-        """
-
-    @abc.abstractproperty
-    def key_size(self):
-        """
-        The bit length of the base point of the curve.
-        """
diff --git a/tests/hazmat/primitives/test_ec.py b/tests/hazmat/primitives/test_ec.py
new file mode 100644
index 0000000..9b31a2a
--- /dev/null
+++ b/tests/hazmat/primitives/test_ec.py
@@ -0,0 +1,73 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+from __future__ import absolute_import, division, print_function
+
+import pytest
+
+from cryptography import utils
+from cryptography.hazmat.primitives import interfaces
+from cryptography.hazmat.primitives.asymmetric import ec
+
+
+@utils.register_interface(interfaces.EllipticCurve)
+class DummyCurve(object):
+    name = "dummy-curve"
+
+
+class TestECC(object):
+    def test_ec_numbers(self):
+        numbers = ec.EllipticCurvePrivateNumbers(
+            1,
+            ec.EllipticCurvePublicNumbers(
+                2, 3, DummyCurve()
+            )
+        )
+
+        assert numbers.private_key == 1
+        assert numbers.public_numbers.x == 2
+        assert numbers.public_numbers.y == 3
+        assert isinstance(numbers.public_numbers.curve, DummyCurve)
+
+        with pytest.raises(TypeError):
+            ec.EllipticCurvePrivateNumbers(
+                None,
+                ec.EllipticCurvePublicNumbers(
+                    2, 3, DummyCurve()
+                )
+            )
+
+        with pytest.raises(TypeError):
+            ec.EllipticCurvePrivateNumbers(
+                1,
+                ec.EllipticCurvePublicNumbers(
+                    None, 3, DummyCurve()
+                )
+            )
+
+        with pytest.raises(TypeError):
+            ec.EllipticCurvePrivateNumbers(
+                1,
+                ec.EllipticCurvePublicNumbers(
+                    2, None, DummyCurve()
+                )
+            )
+
+        with pytest.raises(TypeError):
+            ec.EllipticCurvePrivateNumbers(
+                1,
+                ec.EllipticCurvePublicNumbers(
+                    2, 3, None
+                )
+            )
