diff --git a/.travis.yml b/.travis.yml
index 67ce5ca..d32d411 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,6 +1,5 @@
 language: python
 python:
-  - "2.7"
   - "3.4"
   - "3.5"
   - "3.6"
diff --git a/mobly/asserts.py b/mobly/asserts.py
index 05f99de..bcffb87 100644
--- a/mobly/asserts.py
+++ b/mobly/asserts.py
@@ -20,14 +20,7 @@
 
 # Have an instance of unittest.TestCase so we could reuse some logic from
 # python's own unittest.
-# _ProxyTest is required because py2 does not allow instantiating
-# unittest.TestCase directly.
-class _ProxyTest(unittest.TestCase):
-    def runTest(self):
-        pass
-
-
-_pyunit_proxy = _ProxyTest()
+_pyunit_proxy = unittest.TestCase()
 
 
 def assert_equal(first, second, msg=None, extras=None):
diff --git a/mobly/controllers/android_device.py b/mobly/controllers/android_device.py
index f549653..cdd680b 100644
--- a/mobly/controllers/android_device.py
+++ b/mobly/controllers/android_device.py
@@ -12,9 +12,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from builtins import str as new_str
-from past.builtins import basestring
-
 import contextlib
 import logging
 import os
@@ -108,7 +105,7 @@
     elif isinstance(configs[0], dict):
         # Configs is a list of dicts.
         ads = get_instances_with_configs(configs)
-    elif isinstance(configs[0], basestring):
+    elif isinstance(configs[0], str):
         # Configs is a list of strings representing serials.
         ads = get_instances(configs)
     else:
@@ -190,7 +187,7 @@
         A list of android device serial numbers.
     """
     try:
-        clean_lines = new_str(device_list_str, 'utf-8').strip().split('\n')
+        clean_lines = str(device_list_str, 'utf-8').strip().split('\n')
     except UnicodeDecodeError:
         logging.warning("unicode decode error, origin str: %s", device_list_str)
         raise
@@ -222,7 +219,7 @@
         none.
     """
     out = adb.AdbProxy().devices(['-l'])
-    clean_lines = new_str(out, 'utf-8').strip().split('\n')
+    clean_lines = str(out, 'utf-8').strip().split('\n')
     results = []
     for line in clean_lines:
         tokens = line.strip().split()
@@ -1046,7 +1043,7 @@
             results: results have data flow information
         """
         out = self.adb.shell('iperf3 -c %s %s' % (server_host, extra_args))
-        clean_out = new_str(out, 'utf-8').strip().split('\n')
+        clean_out = str(out, 'utf-8').strip().split('\n')
         if 'error' in clean_out[0].lower():
             return False, clean_out
         return True, clean_out
diff --git a/mobly/controllers/android_device_lib/adb.py b/mobly/controllers/android_device_lib/adb.py
index f57e9a2..05c2af0 100644
--- a/mobly/controllers/android_device_lib/adb.py
+++ b/mobly/controllers/android_device_lib/adb.py
@@ -12,17 +12,14 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from builtins import str
-from past.builtins import basestring
-
 import logging
-import psutil
 import re
 import subprocess
-import time
 import threading
+import time
 
 from mobly import utils
+import psutil
 
 # Command to use for running ADB commands.
 ADB = 'adb'
@@ -263,7 +260,7 @@
                 adb_cmd.extend(['-s', self.serial])
             adb_cmd.append(name)
             if args:
-                if isinstance(args, basestring):
+                if isinstance(args, str):
                     adb_cmd.append(args)
                 else:
                     adb_cmd.extend(args)
diff --git a/mobly/controllers/monsoon.py b/mobly/controllers/monsoon.py
index 337cdb7..951d928 100644
--- a/mobly/controllers/monsoon.py
+++ b/mobly/controllers/monsoon.py
@@ -15,8 +15,6 @@
 (http://msoon.com/LabEquipment/PowerMonitor/).
 """
 
-from past.builtins import basestring
-
 import fcntl
 import io
 import logging
diff --git a/mobly/utils.py b/mobly/utils.py
index ef2bd98..d636f87 100644
--- a/mobly/utils.py
+++ b/mobly/utils.py
@@ -12,8 +12,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from past.builtins import basestring
-
 import base64
 import concurrent.futures
 import datetime
@@ -24,10 +22,8 @@
 import os
 import pipes
 import platform
-import portpicker
 import random
 import re
-import signal
 import string
 import subprocess
 import sys
@@ -35,6 +31,8 @@
 import time
 import traceback
 
+import portpicker
+
 # File name length is limited to 255 chars on some OS, so we need to make sure
 # the file names we output fits within the limit.
 MAX_FILENAME_LEN = 255
@@ -572,7 +570,7 @@
     Returns:
         String representation of the command.
     """
-    if isinstance(args, basestring):
+    if isinstance(args, str):
         # Return directly if it's already a string.
         return args
     return ' '.join([pipes.quote(arg) for arg in args])
