add ExtensionType interface
diff --git a/docs/x509/reference.rst b/docs/x509/reference.rst
index 29b8268..2f997ae 100644
--- a/docs/x509/reference.rst
+++ b/docs/x509/reference.rst
@@ -909,6 +909,13 @@
 
         Returns an instance of the extension type corresponding to the OID.
 
+.. class:: ExtensionType
+
+    .. versionadded:: 1.0
+
+    This is the interface against which all the following extension types are
+    registered.
+
 .. class:: KeyUsage
 
     .. versionadded:: 0.9
diff --git a/src/cryptography/x509.py b/src/cryptography/x509.py
index c8380b1..b8c6d4e 100644
--- a/src/cryptography/x509.py
+++ b/src/cryptography/x509.py
@@ -313,6 +313,16 @@
         return not self == other
 
 
+@six.add_metaclass(abc.ABCMeta)
+class ExtensionType(object):
+    @abc.abstractproperty
+    def oid(self):
+        """
+        Returns the oid associated with the given extension type.
+        """
+
+
+@utils.register_interface(ExtensionType)
 class ExtendedKeyUsage(object):
     oid = OID_EXTENDED_KEY_USAGE
 
@@ -343,10 +353,12 @@
         return not self == other
 
 
+@utils.register_interface(ExtensionType)
 class OCSPNoCheck(object):
     oid = OID_OCSP_NO_CHECK
 
 
+@utils.register_interface(ExtensionType)
 class BasicConstraints(object):
     oid = OID_BASIC_CONSTRAINTS
 
@@ -385,6 +397,7 @@
         return not self == other
 
 
+@utils.register_interface(ExtensionType)
 class KeyUsage(object):
     oid = OID_KEY_USAGE
 
@@ -470,6 +483,7 @@
         return not self == other
 
 
+@utils.register_interface(ExtensionType)
 class AuthorityInformationAccess(object):
     oid = OID_AUTHORITY_INFORMATION_ACCESS
 
@@ -536,6 +550,7 @@
     access_location = utils.read_only_property("_access_location")
 
 
+@utils.register_interface(ExtensionType)
 class CertificatePolicies(object):
     oid = OID_CERTIFICATE_POLICIES
 
@@ -675,6 +690,7 @@
     notice_numbers = utils.read_only_property("_notice_numbers")
 
 
+@utils.register_interface(ExtensionType)
 class SubjectKeyIdentifier(object):
     oid = OID_SUBJECT_KEY_IDENTIFIER
 
@@ -698,6 +714,7 @@
         return not self == other
 
 
+@utils.register_interface(ExtensionType)
 class NameConstraints(object):
     oid = OID_NAME_CONSTRAINTS
 
@@ -764,6 +781,7 @@
     excluded_subtrees = utils.read_only_property("_excluded_subtrees")
 
 
+@utils.register_interface(ExtensionType)
 class CRLDistributionPoints(object):
     oid = OID_CRL_DISTRIBUTION_POINTS
 
@@ -886,6 +904,7 @@
     remove_from_crl = "removeFromCRL"
 
 
+@utils.register_interface(ExtensionType)
 class InhibitAnyPolicy(object):
     oid = OID_INHIBIT_ANY_POLICY
 
@@ -1178,6 +1197,7 @@
         return not self == other
 
 
+@utils.register_interface(ExtensionType)
 class SubjectAlternativeName(object):
     oid = OID_SUBJECT_ALTERNATIVE_NAME
 
@@ -1206,6 +1226,7 @@
         return not self == other
 
 
+@utils.register_interface(ExtensionType)
 class IssuerAlternativeName(object):
     oid = OID_ISSUER_ALTERNATIVE_NAME
 
@@ -1234,6 +1255,7 @@
         return not self == other
 
 
+@utils.register_interface(ExtensionType)
 class AuthorityKeyIdentifier(object):
     oid = OID_AUTHORITY_KEY_IDENTIFIER