diff --git a/lib/spack/spack/cmd/versions.py b/lib/spack/spack/cmd/versions.py
index c4b59582503d705046d2db8e58c918c75e71f170..b264c1aaf09b013b888daf0704f6e8cc7aecbacb 100644
--- a/lib/spack/spack/cmd/versions.py
+++ b/lib/spack/spack/cmd/versions.py
@@ -9,6 +9,7 @@
 import llnl.util.tty as tty
 
 import spack.repo
+import sys
 
 description = "list available versions of a package"
 section = "packaging"
@@ -18,32 +19,42 @@
 def setup_parser(subparser):
     subparser.add_argument('package', metavar='PACKAGE',
                            help='package to list versions for')
+    subparser.add_argument('-s', '--safe-only', action='store_true',
+                           help='only list safe versions of the package')
 
 
 def versions(parser, args):
     pkg = spack.repo.get(args.package)
 
-    tty.msg('Safe versions (already checksummed):')
+    if sys.stdout.isatty():
+        tty.msg('Safe versions (already checksummed):')
 
     safe_versions = pkg.versions
 
     if not safe_versions:
-        print('  Found no versions for {0}'.format(pkg.name))
-        tty.debug('Manually add versions to the package.')
+        if sys.stdout.isatty():
+            tty.warn('Found no versions for {0}'.format(pkg.name))
+            tty.debug('Manually add versions to the package.')
     else:
         colify(sorted(safe_versions, reverse=True), indent=2)
 
-    tty.msg('Remote versions (not yet checksummed):')
+    if args.safe_only:
+        return
+
+    if sys.stdout.isatty():
+        tty.msg('Remote versions (not yet checksummed):')
 
     fetched_versions = pkg.fetch_remote_versions()
     remote_versions = set(fetched_versions).difference(safe_versions)
 
     if not remote_versions:
-        if not fetched_versions:
-            print('  Found no versions for {0}'.format(pkg.name))
-            tty.debug('Check the list_url and list_depth attributes of the '
-                      'package to help Spack find versions.')
-        else:
-            print('  Found no unchecksummed versions for {0}'.format(pkg.name))
+        if sys.stdout.isatty():
+            if not fetched_versions:
+                tty.warn('Found no versions for {0}'.format(pkg.name))
+                tty.debug('Check the list_url and list_depth attributes of '
+                          'the package to help Spack find versions.')
+            else:
+                tty.warn('Found no unchecksummed versions for {0}'.format(
+                    pkg.name))
     else:
         colify(sorted(remote_versions, reverse=True), indent=2)
diff --git a/lib/spack/spack/test/cmd/versions.py b/lib/spack/spack/test/cmd/versions.py
index 5d6574dae4e217173b4f314fc93f9607a474e08f..07761be1d4b3935e47f3fd81b40d93335367a350 100644
--- a/lib/spack/spack/test/cmd/versions.py
+++ b/lib/spack/spack/test/cmd/versions.py
@@ -10,6 +10,12 @@
 versions = SpackCommand('versions')
 
 
+def test_safe_versions():
+    """Only test the safe versions of a package."""
+
+    versions('--safe-only', 'zlib')
+
+
 @pytest.mark.network
 def test_remote_versions():
     """Test a package for which remote versions should be available."""
diff --git a/share/spack/spack-completion.bash b/share/spack/spack-completion.bash
index c465bd6bb6a922916bb8497dcf6b8875044a9bc7..c4113ab0da0e849383a165d2f9401f593f191d94 100755
--- a/share/spack/spack-completion.bash
+++ b/share/spack/spack-completion.bash
@@ -1181,7 +1181,7 @@ function _spack_use {
 function _spack_versions {
     if $list_options
     then
-        compgen -W "-h --help" -- "$cur"
+        compgen -W "-h --help -s --safe-only" -- "$cur"
     else
         compgen -W "$(_all_packages)" -- "$cur"
     fi