diff --git a/lib/spack/spack/__init__.py b/lib/spack/spack/__init__.py
index 54a3e92a576d0cc4749640af6e96caccabece425..3ec0cac441ef81ce780566fa0b91ed49fec8f355 100644
--- a/lib/spack/spack/__init__.py
+++ b/lib/spack/spack/__init__.py
@@ -1,5 +1,5 @@
 from globals import *
-from utils import *
+from util import *
 from error import *
 
 from package import Package
diff --git a/lib/spack/spack/arch.py b/lib/spack/spack/arch.py
index 6610006804bac326ceb940e65143f853969e5ef1..74d2f35c4123f8143cea4c2feeb8635d3f2eb9e0 100644
--- a/lib/spack/spack/arch.py
+++ b/lib/spack/spack/arch.py
@@ -4,7 +4,7 @@
 import spack
 import error as serr
 from version import Version
-from utils import memoized
+from util import memoized
 
 
 class InvalidSysTypeError(serr.SpackError):
diff --git a/lib/spack/spack/cmd/test.py b/lib/spack/spack/cmd/test.py
index 93f38bafe8cff641511b942f70919d2633819227..a246cdf7b68087e418522263e4ae3bbf038b7898 100644
--- a/lib/spack/spack/cmd/test.py
+++ b/lib/spack/spack/cmd/test.py
@@ -1,7 +1,7 @@
 import spack
 import spack.packages as packages
 import spack.test
-from spack.utils import list_modules
+from spack.util import list_modules
 from spack.colify import colify
 from pprint import pprint
 
diff --git a/lib/spack/spack/compilers/__init__.py b/lib/spack/spack/compilers/__init__.py
index 04e084b6ed361b7ca068cb23e6e5c8f7d8d505a5..3ed2db84234307d82bad288ce7bb2f97d2b8c026 100644
--- a/lib/spack/spack/compilers/__init__.py
+++ b/lib/spack/spack/compilers/__init__.py
@@ -4,7 +4,7 @@
 
 import spack
 import spack.compilers.gcc
-from spack.utils import list_modules, memoized
+from spack.util import list_modules, memoized
 
 
 @memoized
diff --git a/lib/spack/spack/directory_layout.py b/lib/spack/spack/directory_layout.py
index 55abb6d4b5aea984e8c3e8e8f1152f27101b28c7..2fdc55dc3f066deb1a4b8518b6298fa208818359 100644
--- a/lib/spack/spack/directory_layout.py
+++ b/lib/spack/spack/directory_layout.py
@@ -3,7 +3,7 @@
 import os
 
 import spack.spec as spec
-from spack.utils import *
+from spack.util import *
 from spack.error import SpackError
 
 
diff --git a/lib/spack/spack/globals.py b/lib/spack/spack/globals.py
index 2001f4dacd1b2fe3c8b3289148f45df57b1b1b52..3dc7310a9dda0419b5b43de3a75d2ba1a48f6af4 100644
--- a/lib/spack/spack/globals.py
+++ b/lib/spack/spack/globals.py
@@ -1,6 +1,6 @@
 import os
 from version import Version
-from utils import *
+from util import *
 import arch
 from directory_layout import DefaultDirectoryLayout
 
diff --git a/lib/spack/spack/none_compare.py b/lib/spack/spack/none_compare.py
deleted file mode 100644
index 67a00b8a40fcd7241f9eb92724c1c313864b6d55..0000000000000000000000000000000000000000
--- a/lib/spack/spack/none_compare.py
+++ /dev/null
@@ -1,60 +0,0 @@
-"""
-Functions for comparing values that may potentially be None.
-Functions prefixed with 'none_low_' treat None as less than all other values.
-Functions prefixed with 'none_high_' treat None as greater than all other values.
-"""
-
-def none_low_lt(lhs, rhs):
-    """Less-than comparison.  None is lower than any value."""
-    return lhs != rhs and (lhs == None or (rhs != None and lhs < rhs))
-
-
-def none_low_le(lhs, rhs):
-    """Less-than-or-equal comparison.  None is less than any value."""
-    return lhs == rhs or none_low_lt(lhs, rhs)
-
-
-def none_low_gt(lhs, rhs):
-    """Greater-than comparison.  None is less than any value."""
-    return lhs != rhs and not none_low_lt(lhs, rhs)
-
-
-def none_low_ge(lhs, rhs):
-    """Greater-than-or-equal comparison.  None is less than any value."""
-    return lhs == rhs or none_low_gt(lhs, rhs)
-
-
-def none_low_min(lhs, rhs):
-    """Minimum function where None is less than any value."""
-    if lhs == None or rhs == None:
-        return None
-    else:
-        return min(lhs, rhs)
-
-
-def none_high_lt(lhs, rhs):
-    """Less-than comparison.  None is greater than any value."""
-    return lhs != rhs and (rhs == None or (lhs != None and lhs < rhs))
-
-
-def none_high_le(lhs, rhs):
-    """Less-than-or-equal comparison.  None is greater than any value."""
-    return lhs == rhs or none_high_lt(lhs, rhs)
-
-
-def none_high_gt(lhs, rhs):
-    """Greater-than comparison.  None is greater than any value."""
-    return lhs != rhs and not none_high_lt(lhs, rhs)
-
-
-def none_high_ge(lhs, rhs):
-    """Greater-than-or-equal comparison.  None is greater than any value."""
-    return lhs == rhs or none_high_gt(lhs, rhs)
-
-
-def none_high_max(lhs, rhs):
-    """Maximum function where None is greater than any value."""
-    if lhs == None or rhs == None:
-        return None
-    else:
-        return max(lhs, rhs)
diff --git a/lib/spack/spack/packages/__init__.py b/lib/spack/spack/packages/__init__.py
index f189e4c3bc5901adb5713b80590df3952e839b5f..01788984ea8293b1d55f9a75b62f656ed0984a45 100644
--- a/lib/spack/spack/packages/__init__.py
+++ b/lib/spack/spack/packages/__init__.py
@@ -8,7 +8,7 @@
 import spack
 import spack.error
 import spack.spec
-from spack.utils import *
+from spack.util import *
 import spack.arch as arch
 
 # Valid package names can contain '-' but can't start with it.
diff --git a/lib/spack/spack/url.py b/lib/spack/spack/url.py
index f1cf3e78f9b1d23d30a579e166e8f7c475597865..1d1fccdfe76736498ae41939cabc4ffcb96a3743 100644
--- a/lib/spack/spack/url.py
+++ b/lib/spack/spack/url.py
@@ -24,7 +24,7 @@
 import re
 
 import spack.error
-import spack.utils
+import spack.util
 from spack.version import Version
 
 #
@@ -61,9 +61,9 @@ def parse_version_string_with_indices(path):
     if os.path.isdir(path):
         stem = os.path.basename(path)
     elif re.search(r'((?:sourceforge.net|sf.net)/.*)/download$', path):
-        stem = spack.utils.stem(os.path.dirname(path))
+        stem = spack.util.stem(os.path.dirname(path))
     else:
-        stem = spack.utils.stem(path)
+        stem = spack.util.stem(path)
 
     version_types = [
         # GitHub tarballs, e.g. v1.2.3
diff --git a/lib/spack/spack/utils.py b/lib/spack/spack/util/__init__.py
similarity index 100%
rename from lib/spack/spack/utils.py
rename to lib/spack/spack/util/__init__.py
diff --git a/lib/spack/spack/util/none_high.py b/lib/spack/spack/util/none_high.py
new file mode 100644
index 0000000000000000000000000000000000000000..897cf9ff8dbe9305c47e21e2a3fb385b2be338d8
--- /dev/null
+++ b/lib/spack/spack/util/none_high.py
@@ -0,0 +1,46 @@
+"""
+Functions for comparing values that may potentially be None.
+These none_high functions consider None as greater than all other values.
+"""
+
+# Preserve builtin min and max functions
+_builtin_min = min
+_builtin_max = max
+
+
+def lt(lhs, rhs):
+    """Less-than comparison.  None is greater than any value."""
+    return lhs != rhs and (rhs == None or (lhs != None and lhs < rhs))
+
+
+def le(lhs, rhs):
+    """Less-than-or-equal comparison.  None is greater than any value."""
+    return lhs == rhs or lt(lhs, rhs)
+
+
+def gt(lhs, rhs):
+    """Greater-than comparison.  None is greater than any value."""
+    return lhs != rhs and not lt(lhs, rhs)
+
+
+def ge(lhs, rhs):
+    """Greater-than-or-equal comparison.  None is greater than any value."""
+    return lhs == rhs or gt(lhs, rhs)
+
+
+def min(lhs, rhs):
+    """Minimum function where None is greater than any value."""
+    if lhs == None:
+        return rhs
+    elif rhs == None:
+        return lhs
+    else:
+        return _builtin_min(lhs, rhs)
+
+
+def max(lhs, rhs):
+    """Maximum function where None is greater than any value."""
+    if lhs == None or rhs == None:
+        return None
+    else:
+        return _builtin_max(lhs, rhs)
diff --git a/lib/spack/spack/util/none_low.py b/lib/spack/spack/util/none_low.py
new file mode 100644
index 0000000000000000000000000000000000000000..c332989248509ac1867c1ddd058a85ed6eb48c67
--- /dev/null
+++ b/lib/spack/spack/util/none_low.py
@@ -0,0 +1,46 @@
+"""
+Functions for comparing values that may potentially be None.
+These none_low functions consider None as less than all other values.
+"""
+
+# Preserve builtin min and max functions
+_builtin_min = min
+_builtin_max = max
+
+
+def lt(lhs, rhs):
+    """Less-than comparison.  None is lower than any value."""
+    return lhs != rhs and (lhs == None or (rhs != None and lhs < rhs))
+
+
+def le(lhs, rhs):
+    """Less-than-or-equal comparison.  None is less than any value."""
+    return lhs == rhs or lt(lhs, rhs)
+
+
+def gt(lhs, rhs):
+    """Greater-than comparison.  None is less than any value."""
+    return lhs != rhs and not lt(lhs, rhs)
+
+
+def ge(lhs, rhs):
+    """Greater-than-or-equal comparison.  None is less than any value."""
+    return lhs == rhs or gt(lhs, rhs)
+
+
+def min(lhs, rhs):
+    """Minimum function where None is less than any value."""
+    if lhs == None or rhs == None:
+        return None
+    else:
+        return _builtin_min(lhs, rhs)
+
+
+def max(lhs, rhs):
+    """Maximum function where None is less than any value."""
+    if lhs == None:
+        return rhs
+    elif rhs == None:
+        return lhs
+    else:
+        return _builtin_max(lhs, rhs)
diff --git a/lib/spack/spack/validate.py b/lib/spack/spack/validate.py
index 4b07d75464c525c9171aa6de7f10e177079029bf..c64fea7574c122286a2ca60e6a089b3e7946d004 100644
--- a/lib/spack/spack/validate.py
+++ b/lib/spack/spack/validate.py
@@ -1,5 +1,5 @@
 import tty
-from utils import ALLOWED_ARCHIVE_TYPES
+from util import ALLOWED_ARCHIVE_TYPES
 from urlparse import urlparse
 
 ALLOWED_SCHEMES    = ["http", "https", "ftp"]
diff --git a/lib/spack/spack/version.py b/lib/spack/spack/version.py
index b3ebed3952238d17a9c3aabad28d62be90328f8d..9ed7b465bb37dff532e5c21b52488aae03fca5c5 100644
--- a/lib/spack/spack/version.py
+++ b/lib/spack/spack/version.py
@@ -25,8 +25,8 @@
 from bisect import bisect_left
 from functools import total_ordering
 
-import utils
-from none_compare import *
+import spack.util.none_high as none_high
+import spack.util.none_low as none_low
 import spack.error
 
 # Valid version characters
@@ -258,9 +258,9 @@ def __lt__(self, other):
         if other is None:
             return False
 
-        return (none_low_lt(self.start, other.start) or
+        return (none_low.lt(self.start, other.start) or
                 (self.start == other.start and
-                 none_high_lt(self.end, other.end)))
+                 none_high.lt(self.end, other.end)))
 
 
     @coerced
@@ -281,8 +281,8 @@ def concrete(self):
 
     @coerced
     def __contains__(self, other):
-        return (none_low_ge(other.start, self.start) and
-                none_high_le(other.end, self.end))
+        return (none_low.ge(other.start, self.start) and
+                none_high.le(other.end, self.end))
 
 
     @coerced
@@ -296,8 +296,8 @@ def overlaps(self, other):
 
     @coerced
     def merge(self, other):
-        return VersionRange(none_low_min(self.start, other.start),
-                            none_high_max(self.end, other.end))
+        return VersionRange(none_low.min(self.start, other.start),
+                            none_high.max(self.end, other.end))
 
 
     def __hash__(self):