diff --git a/config/src/main/java/com/typesafe/config/impl/ConfigDelayedMerge.java b/config/src/main/java/com/typesafe/config/impl/ConfigDelayedMerge.java
index df942d5b..c84895cf 100644
--- a/config/src/main/java/com/typesafe/config/impl/ConfigDelayedMerge.java
+++ b/config/src/main/java/com/typesafe/config/impl/ConfigDelayedMerge.java
@@ -142,6 +142,11 @@ final class ConfigDelayedMerge extends AbstractConfigValue implements Unmergeabl
                     throws NotPossibleToResolve {
                 return ConfigDelayedMerge.makeReplacement(context, stack, skipping);
             }
+
+            @Override
+            public String toString() {
+                return "ResolveReplacer(ConfigDelayedMerge substack skipping=" + skipping + ")";
+            }
         };
     }
 
diff --git a/config/src/main/java/com/typesafe/config/impl/ConfigDelayedMergeObject.java b/config/src/main/java/com/typesafe/config/impl/ConfigDelayedMergeObject.java
index 7e6ced52..52b4cd88 100644
--- a/config/src/main/java/com/typesafe/config/impl/ConfigDelayedMergeObject.java
+++ b/config/src/main/java/com/typesafe/config/impl/ConfigDelayedMergeObject.java
@@ -69,6 +69,11 @@ final class ConfigDelayedMergeObject extends AbstractConfigObject implements Unm
                     throws NotPossibleToResolve {
                 return ConfigDelayedMerge.makeReplacement(context, stack, skipping);
             }
+
+            @Override
+            public String toString() {
+                return "ResolveReplacer(ConfigDelayedMergeObject substack skipping=" + skipping + ")";
+            }
         };
     }
 
diff --git a/config/src/main/java/com/typesafe/config/impl/ResolveReplacer.java b/config/src/main/java/com/typesafe/config/impl/ResolveReplacer.java
index 4cb1c364..b3c2549f 100644
--- a/config/src/main/java/com/typesafe/config/impl/ResolveReplacer.java
+++ b/config/src/main/java/com/typesafe/config/impl/ResolveReplacer.java
@@ -28,5 +28,15 @@ abstract class ResolveReplacer {
                 ConfigImpl.trace(context.depth(), "Cycle detected, can't resolve");
             throw new NotPossibleToResolve(context);
         }
+
+        @Override
+        public String toString() {
+            return "ResolveReplacer(cycle detector)";
+        }
     };
+
+    @Override
+    public String toString() {
+        return getClass().getSimpleName() + "(" + replacement + ")";
+    }
 }