diff --git a/pymbolic/algorithm.py b/pymbolic/algorithm.py
index e27532d4e44ebc33a1e6a414cff980418d42c985..a77b383ff774100d3a6c4ecae581181b7c5cbb32 100644
--- a/pymbolic/algorithm.py
+++ b/pymbolic/algorithm.py
@@ -20,8 +20,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 """
 
-import six
-from six.moves import reduce
 import cmath
 from pytools import memoize
 
@@ -97,6 +95,7 @@ def gcd_many(*args):
     elif len(args) == 1:
         return args[0]
     else:
+        from functools import reduce
         return reduce(gcd, args)
 
 
diff --git a/pymbolic/compiler.py b/pymbolic/compiler.py
index f1be217130a7b76f160bf09ac3e3c0c9c0a4dc3f..f553c0d0d4327cd44072b09e689e4cedfe21182b 100644
--- a/pymbolic/compiler.py
+++ b/pymbolic/compiler.py
@@ -22,7 +22,8 @@ THE SOFTWARE.
 
 import math
 import pymbolic
-from pymbolic.mapper.stringifier import (StringifyMapper, PREC_NONE,
+from pymbolic.mapper.stringifier import (
+        StringifyMapper, PREC_NONE,
         PREC_SUM, PREC_POWER)
 
 
diff --git a/pymbolic/cse.py b/pymbolic/cse.py
index 3e0bce45e9b181ff1e23785c72eae1ee03646ccb..10f6869276ca3ced637fc66760c0e0028dc21e6d 100644
--- a/pymbolic/cse.py
+++ b/pymbolic/cse.py
@@ -1,5 +1,3 @@
-import six
-
 __copyright__ = "Copyright (C) 2009-2013 Andreas Kloeckner"
 
 __license__ = """
diff --git a/pymbolic/geometric_algebra/__init__.py b/pymbolic/geometric_algebra/__init__.py
index d6cfb3f7b0ac77d9d23a6fbf2bd6eafa4e7fc432..32a3cdca7c84dd09b3e5ced622dee703e0cbc10e 100644
--- a/pymbolic/geometric_algebra/__init__.py
+++ b/pymbolic/geometric_algebra/__init__.py
@@ -20,8 +20,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 """
 
-import six
-
 from pytools import memoize, memoize_method
 import numpy as np
 
diff --git a/pymbolic/geometric_algebra/mapper.py b/pymbolic/geometric_algebra/mapper.py
index 3eb3f3252115a0f8c15680f8d2f1e3c6a4de1c9a..9443de226edc05aaf4f77a7b0ac6eafaeeb91a98 100644
--- a/pymbolic/geometric_algebra/mapper.py
+++ b/pymbolic/geometric_algebra/mapper.py
@@ -99,11 +99,9 @@ class StringifyMapper(StringifyMapperBase):
     AXES = {0: "x", 1: "y", 2: "z"}
 
     def map_nabla(self, expr, enclosing_prec):
-        import sys
         return "∇[%s]" % expr.nabla_id
 
     def map_nabla_component(self, expr, enclosing_prec):
-        import sys
         return "∇{}[{}]".format(
                 self.AXES.get(expr.ambient_axis, expr.ambient_axis),
                 expr.nabla_id)
diff --git a/pymbolic/imperative/statement.py b/pymbolic/imperative/statement.py
index 6ef4a6abf6e36dabe94494cee683a48d6d228fa9..176180cfbd4a0ace73eb6407ec6f0f4e65ed7810 100644
--- a/pymbolic/imperative/statement.py
+++ b/pymbolic/imperative/statement.py
@@ -22,9 +22,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 """
 
-
-import six
-
+from sys import intern
 from pytools import RecordWithoutPickling
 
 
@@ -49,7 +47,7 @@ class Statement(RecordWithoutPickling):
     def __init__(self, **kwargs):
         id = kwargs.pop("id", None)
         if id is not None:
-            id = six.moves.intern(id)
+            id = intern(id)
 
         depends_on = frozenset(kwargs.pop("depends_on", []))
         super().__init__(
diff --git a/pymbolic/imperative/utils.py b/pymbolic/imperative/utils.py
index 18cbfef75d90200211b934555f9ae02dd0b9ece8..fd34f4b7aab5846667822eebb963336e6fc81670 100644
--- a/pymbolic/imperative/utils.py
+++ b/pymbolic/imperative/utils.py
@@ -23,10 +23,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 """
 
-
-import six
 import logging
-
 logger = logging.getLogger(__name__)
 
 
diff --git a/pymbolic/interop/maxima.py b/pymbolic/interop/maxima.py
index f5e892abf273ac8ab6ca69438920aec6ee1a98f7..12ac92d9742bbb1be401c236daa0b7381a094e68 100644
--- a/pymbolic/interop/maxima.py
+++ b/pymbolic/interop/maxima.py
@@ -34,12 +34,11 @@ __doc__ = """
 # Inspired by similar code in Sage at:
 # http://trac.sagemath.org/sage_trac/browser/sage/interfaces/maxima.py
 
-import six
-from six.moves import intern
 import re
 import pytools
 import numpy as np
 
+from sys import intern
 from pymbolic.mapper.stringifier import StringifyMapper
 from pymbolic.parser import Parser as ParserBase, FinalizedTuple
 
diff --git a/pymbolic/mapper/__init__.py b/pymbolic/mapper/__init__.py
index ba992e7342559f5746efbb01757447f55379ebd5..a9f54c676d848c694b97d55dc4109a44eb7b5d59 100644
--- a/pymbolic/mapper/__init__.py
+++ b/pymbolic/mapper/__init__.py
@@ -1,6 +1,3 @@
-import six
-from functools import reduce
-
 __copyright__ = "Copyright (C) 2009-2013 Andreas Kloeckner"
 
 __license__ = """
@@ -336,6 +333,7 @@ class Collector(CombineMapper):
 
     def combine(self, values):
         import operator
+        from functools import reduce
         return reduce(operator.or_, values, set())
 
     def map_constant(self, expr):
diff --git a/pymbolic/mapper/coefficient.py b/pymbolic/mapper/coefficient.py
index 32c9f38238e4496d09ae6c0a99be1af412f1ed9b..73276ed229a6cddfa545672ed9e4e28191eeb79e 100644
--- a/pymbolic/mapper/coefficient.py
+++ b/pymbolic/mapper/coefficient.py
@@ -1,5 +1,3 @@
-import six
-
 __copyright__ = "Copyright (C) 2013 Andreas Kloeckner"
 
 __license__ = """
@@ -22,7 +20,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 """
 
-
 from pymbolic.mapper import Mapper
 
 
diff --git a/pymbolic/mapper/collector.py b/pymbolic/mapper/collector.py
index f73c53782861b5d9ac3a3f3d8f3ab42e40be99c3..85cb3c69544d19bd1bc3660799d5bf092bc931d1 100644
--- a/pymbolic/mapper/collector.py
+++ b/pymbolic/mapper/collector.py
@@ -1,5 +1,3 @@
-import six
-
 __copyright__ = "Copyright (C) 2009-2013 Andreas Kloeckner"
 
 __license__ = """
diff --git a/pymbolic/mapper/constant_folder.py b/pymbolic/mapper/constant_folder.py
index 5799efa76fabcfae11fd8a5a2c6e6b6698538576..724c77004a5fe4861d7022b5417e4515b9d3815d 100644
--- a/pymbolic/mapper/constant_folder.py
+++ b/pymbolic/mapper/constant_folder.py
@@ -20,10 +20,10 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 """
 
-from six.moves import reduce
-from pymbolic.mapper import \
-        IdentityMapper, \
-        CSECachingMapperMixin
+from pymbolic.mapper import (
+        IdentityMapper,
+        CSECachingMapperMixin,
+        )
 
 
 class ConstantFoldingMapperBase:
@@ -60,6 +60,7 @@ class ConstantFoldingMapperBase:
                     nonconstants.append(child)
 
         if constants:
+            from functools import reduce
             constant = reduce(op, constants)
             return constructor(tuple([constant]+nonconstants))
         else:
diff --git a/pymbolic/mapper/evaluator.py b/pymbolic/mapper/evaluator.py
index 6b54ea74d9bab0afe23206aa53f9f420c7738e68..889bc90b29021905bd719927405f76537809b5f2 100644
--- a/pymbolic/mapper/evaluator.py
+++ b/pymbolic/mapper/evaluator.py
@@ -23,7 +23,7 @@ THE SOFTWARE.
 
 from pymbolic.mapper import RecursiveMapper, CSECachingMapperMixin
 import operator as op
-from six.moves import reduce
+from functools import reduce
 
 
 class UnknownVariableError(Exception):
diff --git a/pymbolic/mapper/unifier.py b/pymbolic/mapper/unifier.py
index eca76b4780fc5bf855ef18798ee97ffa38578202..cfaa0713aa55a91796341c3755a2fd3c5f4fc7b9 100644
--- a/pymbolic/mapper/unifier.py
+++ b/pymbolic/mapper/unifier.py
@@ -1,5 +1,3 @@
-import six
-
 __copyright__ = "Copyright (C) 2009-2013 Andreas Kloeckner"
 
 __license__ = """
diff --git a/pymbolic/parser.py b/pymbolic/parser.py
index ea9f580e59df80764fc47b3b8473917fb61f2bb4..b846193d6dfb312c6c249d6f95ca5af5b638b20e 100644
--- a/pymbolic/parser.py
+++ b/pymbolic/parser.py
@@ -21,7 +21,7 @@ THE SOFTWARE.
 """
 
 import pytools.lex
-from six.moves import intern
+from sys import intern
 
 _imaginary = intern("imaginary")
 _float = intern("float")
diff --git a/pymbolic/polynomial.py b/pymbolic/polynomial.py
index f4b83dd1fcbca565e3ea705a47c9586a07d12474..774f2fbd23e6c729749e6d6e6b90330388eb0035 100644
--- a/pymbolic/polynomial.py
+++ b/pymbolic/polynomial.py
@@ -1,5 +1,3 @@
-from six.moves import intern
-
 __copyright__ = "Copyright (C) 2009-2013 Andreas Kloeckner"
 
 __license__ = """
@@ -22,14 +20,14 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 """
 
+from sys import intern
+
 import pymbolic
 from pymbolic.primitives import Expression
 import pymbolic.algorithm as algorithm
 from pymbolic.traits import traits, EuclideanRingTraits, FieldTraits
 
 
-
-
 def _sort_uniq(data):
     def sortkey(xxx_todo_changeme): (exp, coeff) = xxx_todo_changeme; return exp
     data.sort(key=sortkey)
@@ -51,15 +49,11 @@ def _sort_uniq(data):
     return uniq_result
 
 
-
-
 def _get_dependencies(expr):
     from pymbolic.mapper.dependency import DependencyMapper
     return DependencyMapper()(expr)
 
 
-
-
 class LexicalMonomialOrder:
     def __call__(self, a, b):
         from pymbolic.primitives import Variable
@@ -74,9 +68,6 @@ class LexicalMonomialOrder:
         return "LexicalMonomialOrder()"
 
 
-
-
-
 class Polynomial(Expression):
     def __init__(self, base, data=None, unit=1, var_less=LexicalMonomialOrder()):
         self.Base = base
@@ -299,8 +290,6 @@ class Polynomial(Expression):
         return 0
 
 
-
-
 def differentiate(poly):
     return Polynomial(
         poly.base,
@@ -309,7 +298,6 @@ def differentiate(poly):
               if not exp == 0))
 
 
-
 def integrate(poly):
     return Polynomial(
         poly.base,
@@ -317,8 +305,6 @@ def integrate(poly):
               for exp, coeff in poly.data))
 
 
-
-
 def integrate_definite(poly, a, b):
     antideriv = integrate(poly)
     a_bound = pymbolic.substitute(antideriv, {poly.base: a})
@@ -328,21 +314,15 @@ def integrate_definite(poly, a, b):
     return Sum((b_bound, -a_bound))
 
 
-
-
 def leading_coefficient(poly):
     return poly.data[-1][1]
 
 
-
-
 def general_polynomial(base, coefflist, degree):
     return Polynomial(base,
             ((i, coefflist[i]) for i in range(degree+1)))
 
 
-
-
 class PolynomialTraits(EuclideanRingTraits):
     @staticmethod
     def norm(x):
@@ -354,8 +334,6 @@ class PolynomialTraits(EuclideanRingTraits):
         return traits(lc).get_unit(lc)
 
 
-
-
 if __name__ == "__main__":
     x = Polynomial(pymbolic.var("x"))
     y = Polynomial(pymbolic.var("y"))
diff --git a/pymbolic/primitives.py b/pymbolic/primitives.py
index f1f3d7ca4124ebb48c4fb2051a2104f62981c700..52393830fba9354e6b02ad4f050b272402c28786 100644
--- a/pymbolic/primitives.py
+++ b/pymbolic/primitives.py
@@ -20,10 +20,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 """
 
+from sys import intern
 import pymbolic.traits as traits
 
-import six
-from six.moves import intern
 
 __doc__ = """
 Expression base class
@@ -1596,9 +1595,6 @@ def quotient(numerator, denominator):
 global VALID_CONSTANT_CLASSES
 global VALID_OPERANDS
 VALID_CONSTANT_CLASSES = (int, float, complex)
-if six.PY2:
-    VALID_CONSTANT_CLASSES += (long,)  # noqa pylint:disable=undefined-variable
-
 VALID_OPERANDS = (Expression,)
 
 try:
diff --git a/pymbolic/rational.py b/pymbolic/rational.py
index 90d1b307581932253e2a13ba6b0a17df854bbcc6..b150a54bc0cf4747631cd189284613b0413bff54 100644
--- a/pymbolic/rational.py
+++ b/pymbolic/rational.py
@@ -20,7 +20,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 """
 
-from six.moves import intern
+from sys import intern
 import pymbolic.primitives as primitives
 import pymbolic.traits as traits
 
diff --git a/pymbolic/traits.py b/pymbolic/traits.py
index c9e7e5b6295b47d1bf61307b7640c4a6109a7d38..4e47628d065e75f895e00ef64d59bb7383365b52 100644
--- a/pymbolic/traits.py
+++ b/pymbolic/traits.py
@@ -1,6 +1,3 @@
-import six
-from functools import reduce
-
 __copyright__ = "Copyright (C) 2009-2013 Andreas Kloeckner"
 
 __license__ = """
@@ -23,6 +20,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 """
 
+from functools import reduce
 from . import algorithm