diff --git a/pybitcoin/__init__.py b/pybitcoin/__init__.py
index 4a9c2d4..94f1055 100644
--- a/pybitcoin/__init__.py
+++ b/pybitcoin/__init__.py
@@ -7,13 +7,8 @@
     :license: MIT, see LICENSE for more details.
 """
 
-import services
 from .services import *
-
-import transactions
 from .transactions import *
-
-import passphrases
 from .passphrases import create_passphrase
 from .passphrases.legacy import (
     random_160bit_passphrase, random_256bit_passphrase
diff --git a/pybitcoin/formatcheck.py b/pybitcoin/formatcheck.py
index dc3ca0a..fc0d5a1 100644
--- a/pybitcoin/formatcheck.py
+++ b/pybitcoin/formatcheck.py
@@ -10,6 +10,7 @@
 import os
 import re
 import random
+import sys
 import binascii
 from utilitybelt import is_int, is_hex
 
@@ -17,7 +18,11 @@
 
 
 def is_secret_exponent(val, curve_order):
-    return (isinstance(val, (int, long)) and val >= 1 and val < curve_order)
+    number_types = [int]
+    if sys.version_info.major < 3:
+        number_types.append(long)
+
+    return (isinstance(val, tuple(number_types)) and val >= 1 and val < curve_order)
 
 
 def is_256bit_hex_string(val):
diff --git a/pybitcoin/rpc/namecoind_client.py b/pybitcoin/rpc/namecoind_client.py
index 2919fa1..9caad84 100644
--- a/pybitcoin/rpc/namecoind_client.py
+++ b/pybitcoin/rpc/namecoind_client.py
@@ -16,38 +16,42 @@
 from .config import NAMECOIND_USE_HTTPS, VALUE_MAX_LIMIT
 
 import ssl
-import httplib
 
-create_ssl_authproxy = False 
+try:
+    from httplib import HTTPSConnection
+except ImportError:
+    from http.client import HTTPSConnection
+
+create_ssl_authproxy = False
 do_wrap_socket = False
 
 if hasattr( ssl, "_create_unverified_context" ):
    #opt-out for verifying self-signed certificates (typically used in namecoin/bitcoind)
    ssl._create_default_https_context = ssl._create_unverified_context
-   create_ssl_authproxy = True 
+   create_ssl_authproxy = True
 
 if not hasattr( ssl, "create_default_context" ):
    create_ssl_authproxy = False
    do_wrap_socket = True
 
 
-class NamecoindConnection( httplib.HTTPSConnection ):
+class NamecoindConnection(HTTPSConnection):
    """
    Wrapped SSL connection, if we can't use SSLContext.
    """
 
    def __init__(self, host, port, timeout=None ):
-   
-      httplib.HTTPSConnection.__init__(self, host, port )
+
+      HTTPSConnection.__init__(self, host, port )
       self.timeout = timeout
-        
+
    def connect( self ):
-      
+
       sock = socket.create_connection((self.host, self.port), self.timeout)
       if self._tunnel_host:
          self.sock = sock
          self._tunnel()
-         
+
       self.sock = ssl.wrap_socket( sock, cert_reqs=ssl.CERT_NONE )
 
 
@@ -59,7 +63,7 @@ def __init__(self, server=NAMECOIND_SERVER, port=NAMECOIND_PORT,
                  passphrase=NAMECOIND_WALLET_PASSPHRASE):
 
         global create_ssl_authproxy, do_wrap_socket
-        
+
         if use_https:
             http_string = 'https://'
         else:
@@ -69,23 +73,23 @@ def __init__(self, server=NAMECOIND_SERVER, port=NAMECOIND_PORT,
 
         self.passphrase = passphrase
         self.server = server
-        
+
         if do_wrap_socket:
            # ssl._create_unverified_context and ssl.create_default_context are not supported.
-           # wrap the socket directly 
+           # wrap the socket directly
            connection = NamecoindConnection( server, int(port) )
            self.obj = AuthServiceProxy(authproxy_config_uri, connection=connection)
-       
+
         elif create_ssl_authproxy:
-           # ssl has _create_unverified_context, so we're good to go 
+           # ssl has _create_unverified_context, so we're good to go
            self.obj = AuthServiceProxy(authproxy_config_uri)
-    
+
         else:
-           # have to set up an unverified context ourselves 
+           # have to set up an unverified context ourselves
            ssl_ctx = ssl.create_default_context()
            ssl_ctx.check_hostname = False
            ssl_ctx.verify_mode = ssl.CERT_NONE
-           connection = httplib.HTTPSConnection( server, int(port), context=ssl_ctx )
+           connection = HTTPSConnection( server, int(port), context=ssl_ctx )
            self.obj = AuthServiceProxy(authproxy_config_uri, connection=connection)
 
 
diff --git a/pybitcoin/services/__init__.py b/pybitcoin/services/__init__.py
index c23214e..cb0d6aa 100644
--- a/pybitcoin/services/__init__.py
+++ b/pybitcoin/services/__init__.py
@@ -8,12 +8,7 @@
 """
 
 from .blockchain_client import BlockchainClient
-from blockcypher import BlockcypherClient
-from blockchain_info import BlockchainInfoClient
-from chain_com import ChainComClient
-from bitcoind import BitcoindClient, create_bitcoind_service_proxy
-
-import blockcypher
-import blockchain_info
-import chain_com
-import bitcoind
+from .blockcypher import BlockcypherClient
+from .blockchain_info import BlockchainInfoClient
+from .chain_com import ChainComClient
+from .bitcoind import BitcoindClient, create_bitcoind_service_proxy
diff --git a/pybitcoin/services/bitcoind.py b/pybitcoin/services/bitcoind.py
index 8d86d9b..12bb3b6 100644
--- a/pybitcoin/services/bitcoind.py
+++ b/pybitcoin/services/bitcoind.py
@@ -7,7 +7,10 @@
     :license: MIT, see LICENSE for more details.
 """
 
-import httplib
+try:
+    from httplib import BadStatusLine
+except ImportError:
+    from http.client import BadStatusLine
 
 from bitcoinrpc.authproxy import AuthServiceProxy
 
@@ -89,7 +92,7 @@ def broadcast_transaction(hex_tx, blockchain_client):
 
     try:
         resp = bitcoind.sendrawtransaction(hex_tx)
-    except httplib.BadStatusLine:
+    except BadStatusLine:
         raise Exception('Invalid HTTP status code from bitcoind.')
 
     if len(resp) > 0:
diff --git a/pybitcoin/services/blockchain_info.py b/pybitcoin/services/blockchain_info.py
index c99b149..cb29f8f 100644
--- a/pybitcoin/services/blockchain_info.py
+++ b/pybitcoin/services/blockchain_info.py
@@ -49,9 +49,9 @@ def get_unspents(address, blockchain_client=BlockchainInfoClient()):
     r = requests.get(url, auth=auth)
     try:
         unspents = r.json()["unspent_outputs"]
-    except ValueError, e:
+    except ValueError as e:
         raise Exception('Invalid response from blockchain.info.')
-    
+
     return format_unspents(unspents)
 
 def broadcast_transaction(hex_tx, blockchain_client=BlockchainInfoClient()):
@@ -60,10 +60,8 @@ def broadcast_transaction(hex_tx, blockchain_client=BlockchainInfoClient()):
     url = BLOCKCHAIN_API_BASE_URL + '/pushtx'
     payload = {'tx': hex_tx}
     r = requests.post(url, data=payload, auth=blockchain_client.auth)
-    
+
     if 'submitted' in r.text.lower():
         return {'success': True}
     else:
         raise Exception('Invalid response from blockchain.info.')
-
-
diff --git a/pybitcoin/services/chain_com.py b/pybitcoin/services/chain_com.py
index 9690319..17ac6ad 100644
--- a/pybitcoin/services/chain_com.py
+++ b/pybitcoin/services/chain_com.py
@@ -51,9 +51,9 @@ def get_unspents(address, blockchain_client=ChainComClient()):
 
     try:
         unspents = r.json()
-    except ValueError, e:
+    except ValueError as e:
         raise Exception('Received non-JSON response from chain.com.')
-    
+
     return format_unspents(unspents)
 
 def broadcast_transaction(hex_tx, blockchain_client):
@@ -72,7 +72,7 @@ def broadcast_transaction(hex_tx, blockchain_client):
 
     try:
         data = r.json()
-    except ValueError, e:
+    except ValueError as e:
         raise Exception('Received non-JSON from chain.com.')
 
     if 'transaction_hash' in data:
@@ -82,4 +82,3 @@ def broadcast_transaction(hex_tx, blockchain_client):
         return reply
     else:
         raise Exception('Tx hash missing from chain.com response: ' + str(data) + '\noriginal: ' + str(payload))
-
diff --git a/pybitcoin/transactions/__init__.py b/pybitcoin/transactions/__init__.py
index f402ec2..aa01d8f 100644
--- a/pybitcoin/transactions/__init__.py
+++ b/pybitcoin/transactions/__init__.py
@@ -7,8 +7,6 @@
     :license: MIT, see LICENSE for more details.
 """
 
-import opcodes
-
 from .network import broadcast_transaction, send_to_address, get_unspents, \
     embed_data_in_blockchain, make_send_to_address_tx, make_op_return_tx, \
     analyze_private_key, serialize_sign_and_broadcast, \
diff --git a/pybitcoin/transactions/utils.py b/pybitcoin/transactions/utils.py
index 1164355..bcf9543 100644
--- a/pybitcoin/transactions/utils.py
+++ b/pybitcoin/transactions/utils.py
@@ -8,6 +8,7 @@
 """
 
 import struct
+import sys
 from binascii import hexlify, unhexlify
 from utilitybelt import is_hex
 
@@ -26,7 +27,11 @@ def variable_length_int(i):
     """ Encodes integers into variable length integers, which are used in
         Bitcoin in order to save space.
     """
-    if not isinstance(i, (int,long)):
+    number_types = [int]
+    if sys.version_info.major < 3:
+        number_types.append(long)
+
+    if not isinstance(i, tuple(number_types)):
         raise Exception('i must be an integer')
 
     if i < (2**8-3):
@@ -38,4 +43,4 @@ def variable_length_int(i):
     elif i < (2**64):
         return chr(255) + struct.pack('<Q', i) # pack into 8 bites
     else:
-        raise Exception('Integer cannot exceed 8 bytes in length.')
\ No newline at end of file
+        raise Exception('Integer cannot exceed 8 bytes in length.')