diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/DoCall.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/DoCall.java
index 5617d62883c2e33778ea04ea020f7afeae3489c3..cdc3849a10373d9ffac263a99a4c06ce4205bd53 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/DoCall.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/DoCall.java
@@ -106,7 +106,7 @@ public abstract class DoCall extends RBuiltinNode {
                 containsRLanguageProfile.enter();
                 callerFrame = getCallerFrame(frame, callerFrame);
                 RLanguage lang = (RLanguage) arg;
-                argValues[i] = createArgPromise(callerFrame, NodeUtil.cloneNode(((RNode) lang.getRep())));
+                argValues[i] = createArgPromise(callerFrame, RASTUtils.cloneNode((lang.getRep())));
             } else if (arg instanceof RSymbol) {
                 containsRSymbolProfile.enter();
                 RSymbol symbol = (RSymbol) arg;
diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Substitute.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Substitute.java
index b1d87e977a5f17c7762880860494856eb25e7087..c27ec309c8b2c1a569144bd6efe3b2912a2e9567 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Substitute.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Substitute.java
@@ -115,7 +115,7 @@ public abstract class Substitute extends RBuiltinNode {
         // so get the actual expression (AST) from that
         Node node = RASTUtils.unwrap(expr.getRep());
         // substitution is destructive so clone the tree
-        RSyntaxNode rNode = (RSyntaxNode) NodeUtil.cloneNode(node);
+        RSyntaxNode rNode = (RSyntaxNode) RASTUtils.cloneNode(node);
         RSyntaxNode subRNode = rNode.substituteImpl(env);
         // create source for entire tree
         RASTDeparse.ensureSourceSection(subRNode);
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/InlineCacheNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/InlineCacheNode.java
index 775f591be35e51434d1cf5b0b3ec794dd336e0be..988dbcd90d7977d872596f18855cf09eb4939c9e 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/InlineCacheNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/InlineCacheNode.java
@@ -69,7 +69,7 @@ public abstract class InlineCacheNode extends RBaseNode {
     }
 
     protected RNode cache(Object value) {
-        return NodeUtil.cloneNode(reify.apply(value));
+        return RASTUtils.cloneNode(reify.apply(value));
     }
 
     @Specialization(contains = "doCached")
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RASTUtils.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RASTUtils.java
index 604bafe2dfca14bd188b630321abf1111a34a218..e5befeafb9e4785da6d2791a36ccd12acc29bcbd 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RASTUtils.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/RASTUtils.java
@@ -65,6 +65,15 @@ import com.oracle.truffle.r.runtime.nodes.RSyntaxNode;
  */
 public class RASTUtils {
 
+    /**
+     * Central location for all node cloning operations, in preference to {@link NodeUtil#cloneNode}
+     * .
+     */
+    public static RNode cloneNode(Node node) {
+        RNode result = (RNode) NodeUtil.cloneNode(node);
+        return result;
+    }
+
     /**
      * Removes any {@link WrapArgumentNode} or {@link WrapperNode}.
      */
@@ -177,7 +186,7 @@ public class RASTUtils {
             return RASTUtils.createReadVariableNode(((RSymbol) value).getName());
         } else if (value instanceof RLanguage) {
             RLanguage l = (RLanguage) value;
-            return (RNode) NodeUtil.cloneNode((Node) l.getRep());
+            return RASTUtils.cloneNode(l.getRep());
         } else if (value instanceof RPromise) {
             RPromise promise = (RPromise) value;
             RNode promiseRep = (RNode) unwrap(((RPromise) value).getRep());
@@ -195,7 +204,7 @@ public class RASTUtils {
                     return null;
                 }
             }
-            return NodeUtil.cloneNode(promiseRep);
+            return RASTUtils.cloneNode(promiseRep);
         } else {
             return ConstantNode.create(value);
         }
@@ -340,9 +349,9 @@ public class RASTUtils {
             // strange special case, mimics GnuR behavior
             return RASTUtils.createReadVariableNode("");
         } else if (val instanceof RPromise) {
-            return (RSyntaxNode) NodeUtil.cloneNode(RASTUtils.unwrap(((RPromise) val).getRep()));
+            return (RSyntaxNode) RASTUtils.cloneNode(RASTUtils.unwrap(((RPromise) val).getRep()));
         } else if (val instanceof RLanguage) {
-            return (RSyntaxNode) NodeUtil.cloneNode((RNode) ((RLanguage) val).getRep());
+            return (RSyntaxNode) RASTUtils.cloneNode(((RLanguage) val).getRep());
         } else if (val instanceof RArgsValuesAndNames) {
             // this is '...'
             RArgsValuesAndNames rva = (RArgsValuesAndNames) val;
@@ -369,7 +378,7 @@ public class RASTUtils {
                 }
                 if (argval instanceof RPromise) {
                     RPromise promise = (RPromise) argval;
-                    expandedNodes[i] = (RSyntaxNode) NodeUtil.cloneNode(RASTUtils.unwrap(promise.getRep()));
+                    expandedNodes[i] = (RSyntaxNode) RASTUtils.cloneNode(RASTUtils.unwrap(promise.getRep()));
                 } else {
                     expandedNodes[i] = ConstantNode.create(argval);
                 }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/AccessArgumentNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/AccessArgumentNode.java
index bb9ba8b0f5f0a1bef519cf52ec64182b9a4eeee4..674e62112192f5cfd75a4113ee6a9c9f00f4410f 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/AccessArgumentNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/AccessArgumentNode.java
@@ -159,7 +159,7 @@ public final class AccessArgumentNode extends RNode {
             CompilerDirectives.transferToInterpreterAndInvalidate();
             // TODO: all tests pass without it but perhaps we should "re-wrap" promises here?
             if (isOptimizableDefault(arg)) {
-                optDefaultArgNode = new OptVariableDefaultPromiseNode(factory, (ReadVariableNode) NodeUtil.cloneNode(arg), ArgumentStatePush.INVALID_INDEX);
+                optDefaultArgNode = new OptVariableDefaultPromiseNode(factory, (ReadVariableNode) RASTUtils.cloneNode(arg), ArgumentStatePush.INVALID_INDEX);
             } else {
                 Object optimizableConstant = getOptimizableConstant(arg);
                 if (optimizableConstant != null) {
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java
index 9a96344df89cdb1d977e506232b9ed0330800d23..effb4bf752444061e8dc968209a61a32567b50b1 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java
@@ -184,7 +184,7 @@ public final class ReadVariableNode extends RSourceSectionNode implements RSynta
     public RSyntaxNode substituteImpl(REnvironment env) {
         RSyntaxNode result = RASTUtils.substituteName(identifierAsString, env);
         if (result == null) {
-            result = NodeUtil.cloneNode(this);
+            result = (RSyntaxNode) RASTUtils.cloneNode(this);
         }
         return result;
     }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseNode.java
index 98907ab1feb932fa6b2775e9b8de24a97f64e381..be17840af75a9c87650a192e0328b07b8cd23550 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseNode.java
@@ -88,7 +88,7 @@ public abstract class PromiseNode extends RNode {
 
     public static RNode createInlined(RNode expression, Object defaultValue, boolean unwrap) {
         CompilerAsserts.neverPartOfCompilation();
-        RNode clonedExpression = NodeUtil.cloneNode(expression);
+        RNode clonedExpression = RASTUtils.cloneNode(expression);
         RNode pn = clonedExpression instanceof ConstantNode ? clonedExpression : new InlinedSuppliedArgumentNode(clonedExpression, defaultValue, unwrap);
         return pn;
     }
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java
index c60f9c64995af473eb245023a4eabf3e2c12843d..929d5dfb98d2b01b4d9f17ce57944aa3b01188d3 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/RCallNode.java
@@ -237,7 +237,7 @@ public final class RCallNode extends RSourceSectionNode implements RSyntaxNode,
             SyntaxArguments sa = new SyntaxArguments(new RSyntaxNode[v.length]);
             for (int i = 0; i < v.length; i++) {
                 if (v[i] != null) {
-                    RSyntaxNode viClone = (RSyntaxNode) NodeUtil.cloneNode(v[i].asRNode());
+                    RSyntaxNode viClone = (RSyntaxNode) RASTUtils.cloneNode(v[i].asRNode());
                     sa.v[i] = viClone;
                 }
             }
@@ -330,7 +330,7 @@ public final class RCallNode extends RSourceSectionNode implements RSyntaxNode,
                     CompilerDirectives.transferToInterpreterAndInvalidate();
                     dispatchTempSlot = insert(FrameSlotNode.createInitialized(frame.getFrameDescriptor(), defaultTempIdentifiers[0], true));
                     internalDispatchCall = insert(new UninitializedCallNode(this, defaultTempIdentifiers[0]));
-                    dispatchArgument = insert(NodeUtil.cloneNode(arguments.v[0].asRNode()));
+                    dispatchArgument = insert(RASTUtils.cloneNode(arguments.v[0].asRNode()));
                     dispatchLookup = insert(S3FunctionLookupNode.create(true, false));
                     classHierarchyNode = insert(ClassHierarchyNodeGen.create(false, true));
                 }
@@ -413,7 +413,7 @@ public final class RCallNode extends RSourceSectionNode implements RSyntaxNode,
             if (i == 0 && dispatchTempIdentifier != null) {
                 args[0] = new GetTempNode(dispatchTempIdentifier, arguments.v[0]);
             } else {
-                args[i] = arguments.v[i] == null ? null : NodeUtil.cloneNode(arguments.v[i].asRNode());
+                args[i] = arguments.v[i] == null ? null : RASTUtils.cloneNode(arguments.v[i].asRNode());
             }
         }
         return CallArgumentsNode.create(modeChange, modeChangeAppliesToAll, args, signature);
@@ -607,7 +607,7 @@ public final class RCallNode extends RSourceSectionNode implements RSyntaxNode,
         for (int i = 0; i < args.length; i++) {
             args[i] = i < replacementArgs.length ? replacementArgs[i] : call.arguments.v[i];
         }
-        return new RCallNode(call.getSourceSection(), NodeUtil.cloneNode(call.functionNode), args, call.signature);
+        return new RCallNode(call.getSourceSection(), RASTUtils.cloneNode(call.functionNode), args, call.signature);
     }
 
     /**
@@ -984,7 +984,7 @@ public final class RCallNode extends RSourceSectionNode implements RSyntaxNode,
 
             // Extend cache
             this.depth += 1;
-            CallArgumentsNode clonedArgs = NodeUtil.cloneNode(args);
+            CallArgumentsNode clonedArgs = (CallArgumentsNode) RASTUtils.cloneNode(args);
             VarArgsCacheCallNode next = createNextNode(function);
             DispatchedVarArgsCallNode newCallNode = DispatchedVarArgsCallNode.create(frame, clonedArgs, next, this, function, varArgsSignature);
             return replace(newCallNode).execute(frame, function, varArgsSignature, s3Args);
@@ -994,7 +994,7 @@ public final class RCallNode extends RSourceSectionNode implements RSyntaxNode,
             if (depth < VARARGS_INLINE_CACHE_SIZE) {
                 return this;
             } else {
-                CallArgumentsNode clonedArgs = NodeUtil.cloneNode(args);
+                CallArgumentsNode clonedArgs = (CallArgumentsNode) RASTUtils.cloneNode(args);
                 return new DispatchedGenericVarArgsCallNode(function, clonedArgs, originalCall);
             }
         }