diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py
index 084b8176ec1c59e15e0a6e894712b201e79fbd5f..f8991413cd603f7d00ffb94b1f1ba18b5b081460 100644
--- a/lib/spack/spack/spec.py
+++ b/lib/spack/spack/spec.py
@@ -1462,7 +1462,8 @@ def to_node_dict(self, hash_function=None, all_deps=False):
                 'module': self.external_module
             }
 
-        d['concrete'] = self._concrete
+        if not self._concrete:
+            d['concrete'] = False
 
         if 'patches' in self.variants:
             variant = self.variants['patches']
@@ -1560,8 +1561,8 @@ def from_node_dict(node):
             spec.external_path = None
             spec.external_module = None
 
-        if 'concrete' in node:
-            spec._concrete = node['concrete']
+        # specs read in are concrete unless marked abstract
+        spec._concrete = node.get('concrete', True)
 
         if 'patches' in node:
             patches = node['patches']