--- a/anyjson/__init__.py
+++ b/anyjson/__init__.py
@@ -23,9 +23,9 @@ if sys.version_info[0] == 3:
     from io import StringIO
 else:
     try:
-        from cStringIO import StringIO  # noqa
+        from io import StringIO  # noqa
     except ImportError:
-        from StringIO import StringIO   # noqa
+        from io import StringIO   # noqa
 
 #: List of known json modules, and the names of their loads/dumps
 #: methods, as well as the exceptions they throw.  Exception can be either
@@ -47,7 +47,7 @@ class _JsonImplementation(object):
     """Incapsulates a JSON implementation"""
 
     def __init__(self, modspec):
-        modinfo = dict(zip(_fields, modspec))
+        modinfo = dict(list(zip(_fields, modspec)))
 
         if modinfo["modname"] == "cjson":
             import warnings
@@ -64,9 +64,9 @@ class _JsonImplementation(object):
         self._encode_error = modinfo["encerror"]
         self._decode_error = modinfo["decerror"]
 
-        if isinstance(modinfo["encerror"], basestring):
+        if isinstance(modinfo["encerror"], str):
             self._encode_error = getattr(module, modinfo["encerror"])
-        if isinstance(modinfo["decerror"], basestring):
+        if isinstance(modinfo["decerror"], str):
             self._decode_error = getattr(module, modinfo["decerror"])
 
         self.name = modinfo["modname"]
@@ -85,8 +85,8 @@ class _JsonImplementation(object):
         TypeError if the object could not be serialized."""
         try:
             return self._encode(data)
-        except self._encode_error, exc:
-            raise TypeError, TypeError(*exc.args), sys.exc_info()[2]
+        except self._encode_error as exc:
+            raise TypeError(TypeError(*exc.args)).with_traceback(sys.exc_info()[2])
     serialize = dumps
 
     def loads(self, s):
@@ -94,11 +94,11 @@ class _JsonImplementation(object):
         ValueError if the string could not be parsed."""
         # uses StringIO to support buffer objects.
         try:
-            if self._filedecode and not isinstance(s, basestring):
+            if self._filedecode and not isinstance(s, str):
                 return self._filedecode(StringIO(s))
             return self._decode(s)
-        except self._decode_error, exc:
-            raise ValueError, ValueError(*exc.args), sys.exc_info()[2]
+        except self._decode_error as exc:
+            raise ValueError(ValueError(*exc.args)).with_traceback(sys.exc_info()[2])
     deserialize = loads
 
 
@@ -117,7 +117,7 @@ if __name__ == "__main__":
     # We do NOT try to load a compatible module because that may throw an
     # exception, which renders the package uninstallable with easy_install
     # (It trys to execfile the script when installing, to make sure it works)
-    print "Running anyjson as a stand alone script is not supported"
+    print("Running anyjson as a stand alone script is not supported")
     sys.exit(1)
 else:
     for modspec in _modules:
--- a/tests/benchmark.py
+++ b/tests/benchmark.py
@@ -4,7 +4,7 @@ Simple benchmark script to do some basic
 
 import sys
 import time
-import urllib
+import urllib.request, urllib.parse, urllib.error
 
 _small = """
 {
@@ -77,8 +77,8 @@ _twitter = "[]"
 
 def load_external_json():
     global _reddit, _twitter
-    _reddit = urllib.urlopen("http://reddit.com/.json").read()
-    _twitter = urllib.urlopen("http://api.twitter.com/1/statuses/user_timeline.json?screen_name=twitterapi&count=200").read()
+    _reddit = urllib.request.urlopen("http://reddit.com/.json").read()
+    _twitter = urllib.request.urlopen("http://api.twitter.com/1/statuses/user_timeline.json?screen_name=twitterapi&count=200").read()
 
 
 def do_benchmark(impspec, json, runs=10):
@@ -93,13 +93,13 @@ def do_benchmark(impspec, json, runs=10)
         return None
 
     start = time.time()
-    for n in xrange(runs):
+    for n in range(runs):
         data = reads(json)
 
     readtime = time.time() - start
 
     start = time.time()
-    for n in xrange(runs):
+    for n in range(runs):
         devnull = dumps(data)
 
     return readtime, time.time() - start # tuple (readtime, writetime)
@@ -131,13 +131,13 @@ for e in modules:
 
 no_res = set([e for e in res if e[1] is None])
 res = list(set(res) - no_res)
-res = [(e[0], sum(map(lambda x:x[0], e[1:])), sum(map(lambda x:x[1], e[1:]))) for e in res]
+res = [(e[0], sum([x[0] for x in e[1:]]), sum([x[1] for x in e[1:]])) for e in res]
 
 res.sort(lambda a,b: cmp((a[1]+a[2]), b[1]+b[2]))
 
-print "Total  Read   Write  Implementation"
-print "-----------------------------------"
+print("Total  Read   Write  Implementation")
+print("-----------------------------------")
 for e in res:
-    print "%.3f  %.3f  %.3f  %s" % (e[1]+e[2], e[1], e[2], e[0])
+    print("%.3f  %.3f  %.3f  %s" % (e[1]+e[2], e[1], e[2], e[0]))
 for e in no_res:
-    print "Not installed:", e[0]
+    print("Not installed:", e[0])
--- a/tests/test_implementations.py
+++ b/tests/test_implementations.py
@@ -54,4 +54,4 @@ def test_json_loads_unicode():
     except ImportError:
         return
 
-    assert "foo" in anyjson.loads(u'{"foo": "bar"}')
+    assert "foo" in anyjson.loads('{"foo": "bar"}')
