Initial work
diff --git a/cryptography/exceptions.py b/cryptography/exceptions.py
index b496259..b98f6ab 100644
--- a/cryptography/exceptions.py
+++ b/cryptography/exceptions.py
@@ -11,8 +11,29 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+import abc
 
-class UnsupportedAlgorithm(Exception):
+import six
+
+from cryptography import utils
+
+
+class UnsupportedAlgorithm(six.with_metaclass(abc.ABCBase)):
+    pass
+
+
+@utils.register_interface(UnsupportedAlgorithm)
+class UnsupportedCipher(Exception):
+    pass
+
+
+@utils.register_interface(UnsupportedAlgorithm)
+class UnsupportedHash(Exception):
+    pass
+
+
+@utils.register_interface(UnsupportedAlgorithm)
+class UnsupportedPadding(Exception):
     pass
 
 
@@ -46,7 +67,3 @@
 
 class InvalidToken(Exception):
     pass
-
-
-class UnsupportedPadding(Exception):
-    pass
diff --git a/cryptography/hazmat/backends/commoncrypto/backend.py b/cryptography/hazmat/backends/commoncrypto/backend.py
index 4a451d3..53228b3 100644
--- a/cryptography/hazmat/backends/commoncrypto/backend.py
+++ b/cryptography/hazmat/backends/commoncrypto/backend.py
@@ -17,7 +17,7 @@
 
 from cryptography import utils
 from cryptography.exceptions import (
-    UnsupportedAlgorithm, InvalidTag, InternalError
+    InvalidTag, InternalError, UnsupportedCipher, UnsupportedHash
 )
 from cryptography.hazmat.backends.interfaces import (
     HashBackend, HMACBackend, CipherBackend, PBKDF2HMACBackend
@@ -273,7 +273,7 @@
         try:
             cipher_enum, mode_enum = registry[type(cipher), type(mode)]
         except KeyError:
-            raise UnsupportedAlgorithm(
+            raise UnsupportedCipher(
                 "cipher {0} in {1} mode is not supported "
                 "by this backend".format(
                     cipher.name, mode.name if mode else mode)
@@ -346,7 +346,7 @@
         try:
             cipher_enum, mode_enum = registry[type(cipher), type(mode)]
         except KeyError:
-            raise UnsupportedAlgorithm(
+            raise UnsupportedCipher(
                 "cipher {0} in {1} mode is not supported "
                 "by this backend".format(
                     cipher.name, mode.name if mode else mode)
@@ -420,7 +420,7 @@
             try:
                 methods = self._backend._hash_mapping[self.algorithm.name]
             except KeyError:
-                raise UnsupportedAlgorithm(
+                raise UnsupportedHash(
                     "{0} is not a supported hash on this backend".format(
                         algorithm.name)
                 )
@@ -463,7 +463,7 @@
             try:
                 alg = self._backend._supported_hmac_algorithms[algorithm.name]
             except KeyError:
-                raise UnsupportedAlgorithm(
+                raise UnsupportedHash(
                     "{0} is not a supported HMAC hash on this backend".format(
                         algorithm.name)
                 )
diff --git a/cryptography/hazmat/backends/openssl/backend.py b/cryptography/hazmat/backends/openssl/backend.py
index 00fdc26..47d2b10 100644
--- a/cryptography/hazmat/backends/openssl/backend.py
+++ b/cryptography/hazmat/backends/openssl/backend.py
@@ -17,8 +17,8 @@
 
 from cryptography import utils
 from cryptography.exceptions import (
-    UnsupportedAlgorithm, InvalidTag, InternalError, AlreadyFinalized,
-    UnsupportedPadding
+    InvalidTag, InternalError, AlreadyFinalized, UnsupportedPadding,
+    UnsupportedCipher, UnsupportedHash
 )
 from cryptography.hazmat.backends.interfaces import (
     CipherBackend, HashBackend, HMACBackend, PBKDF2HMACBackend, RSABackend
@@ -206,7 +206,7 @@
             assert res == 1
         else:
             if not isinstance(algorithm, hashes.SHA1):
-                raise UnsupportedAlgorithm(
+                raise UnsupportedHash(
                     "This version of OpenSSL only supports PBKDF2HMAC with "
                     "SHA1"
                 )
@@ -377,7 +377,7 @@
         try:
             adapter = registry[type(cipher), type(mode)]
         except KeyError:
-            raise UnsupportedAlgorithm(
+            raise UnsupportedCipher(
                 "cipher {0} in {1} mode is not supported "
                 "by this backend".format(
                     cipher.name, mode.name if mode else mode)
@@ -385,7 +385,7 @@
 
         evp_cipher = adapter(self._backend, cipher, mode)
         if evp_cipher == self._backend._ffi.NULL:
-            raise UnsupportedAlgorithm(
+            raise UnsupportedCipher(
                 "cipher {0} in {1} mode is not supported "
                 "by this backend".format(
                     cipher.name, mode.name if mode else mode)
@@ -496,7 +496,7 @@
             evp_md = self._backend._lib.EVP_get_digestbyname(
                 algorithm.name.encode("ascii"))
             if evp_md == self._backend._ffi.NULL:
-                raise UnsupportedAlgorithm(
+                raise UnsupportedHash(
                     "{0} is not a supported hash on this backend".format(
                         algorithm.name)
                 )
@@ -545,7 +545,7 @@
             evp_md = self._backend._lib.EVP_get_digestbyname(
                 algorithm.name.encode('ascii'))
             if evp_md == self._backend._ffi.NULL:
-                raise UnsupportedAlgorithm(
+                raise UnsupportedHash(
                     "{0} is not a supported hash on this backend".format(
                         algorithm.name)
                 )