diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java
index 621292af809b246636c5832544e47c4257068b49..ce6a668a1d7d4a1758fe6505bcba8cf22fb26b69 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java
@@ -658,8 +658,8 @@ final class REngine implements Engine, Engine.Timings {
 
     @TruffleBoundary
     private static boolean checkResult(Object result) {
-        if (FastROptions.CheckResultCompleteness.getBooleanValue() && result instanceof RAbstractVector && ((RAbstractVector) result).isComplete()) {
-            assert ((RAbstractVector) result).checkCompleteness() : "vector: " + result + " is not complete, but isComplete flag is true";
+        if (FastROptions.CheckResultCompleteness.getBooleanValue() && result instanceof RAbstractVector) {
+            assert RAbstractVector.verify((RAbstractVector) result);
         }
         return true;
     }
diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/DoSetViewPort.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/DoSetViewPort.java
index 87ac3095c6689f05bc93ba6516e6732797683790..1bdce4fb65e441e2951aeb3a516f2f6457ea8a23 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/DoSetViewPort.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/DoSetViewPort.java
@@ -38,6 +38,7 @@ import com.oracle.truffle.r.runtime.data.RNull;
 import com.oracle.truffle.r.runtime.data.model.RAbstractContainer;
 import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector;
 import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
 import com.oracle.truffle.r.runtime.env.REnvironment;
 
 final class DoSetViewPort {
@@ -74,7 +75,7 @@ final class DoSetViewPort {
         pushedViewPort.setDataAt(ViewPort.PVP_DEVWIDTHCM, scalar(Unit.inchesToCm(currentDevice.getWidth())));
         pushedViewPort.setDataAt(ViewPort.PVP_DEVHEIGHTCM, scalar(Unit.inchesToCm(currentDevice.getHeight())));
 
-        assert pushedViewPort.verify();
+        assert RAbstractVector.verify(pushedViewPort);
         return pushedViewPort;
     }
 
diff --git a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridState.java b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridState.java
index c1cfe4461c2f329c6d60fda68c3fe648c2db9791..77f8e4293eab0192390b1f6552f99e863b47a582 100644
--- a/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridState.java
+++ b/com.oracle.truffle.r.library/src/com/oracle/truffle/r/library/fastrGrid/GridState.java
@@ -18,6 +18,7 @@ import com.oracle.truffle.r.library.fastrGrid.device.GridDevice;
 import com.oracle.truffle.r.library.fastrGrid.grDevices.FileDevUtils;
 import com.oracle.truffle.r.runtime.data.RList;
 import com.oracle.truffle.r.runtime.data.RNull;
+import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
 import com.oracle.truffle.r.runtime.env.REnvironment;
 
 public final class GridState {
@@ -104,7 +105,7 @@ public final class GridState {
 
     public void initGPar(GridDevice currentDevice) {
         devState.gpar = GPar.createNew(currentDevice);
-        assert devState.gpar.verify();
+        assert RAbstractVector.verify(devState.gpar);
     }
 
     /**
@@ -143,7 +144,7 @@ public final class GridState {
     }
 
     public void setViewPort(RList viewPort) {
-        assert viewPort.verify();
+        assert RAbstractVector.verify(viewPort);
         devState.viewPort = viewPort;
     }
 
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RComplexVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RComplexVector.java
index b6ebdd269672c73bb84b594f94f946f4d9f4ecaa..b42c2d6f77235b2467e3710f84f488c19e996cd0 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RComplexVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RComplexVector.java
@@ -45,7 +45,7 @@ public final class RComplexVector extends RVector<double[]> implements RAbstract
         super(complete);
         assert data.length % 2 == 0;
         this.data = data;
-        assert verify();
+        assert RAbstractVector.verify(this);
     }
 
     RComplexVector(double[] data, boolean complete, int[] dims, RStringVector names, RList dimNames) {
@@ -117,18 +117,6 @@ public final class RComplexVector extends RVector<double[]> implements RAbstract
         return NativeDataAccess.getData(this, data, index);
     }
 
-    @Override
-    public boolean verify() {
-        if (isComplete()) {
-            for (int i = 0; i < getLength(); i++) {
-                if (getDataAt(i).isNA()) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
     @Override
     public double[] getDataCopy() {
         if (data != null) {
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDoubleVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDoubleVector.java
index 197d34d2141713847879757bd77ad64346113d36..e37787fd868e78c8d4c0f6523e10dbc293eb290d 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDoubleVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDoubleVector.java
@@ -44,7 +44,7 @@ public final class RDoubleVector extends RVector<double[]> implements RAbstractD
     RDoubleVector(double[] data, boolean complete) {
         super(complete);
         this.data = data;
-        assert verify();
+        assert RAbstractVector.verify(this);
     }
 
     RDoubleVector(double[] data, boolean complete, int[] dims, RStringVector names, RList dimNames) {
@@ -131,18 +131,6 @@ public final class RDoubleVector extends RVector<double[]> implements RAbstractD
         return NativeDataAccess.getDataLength(this, data);
     }
 
-    @Override
-    public boolean verify() {
-        if (isComplete()) {
-            for (int i = 0; i < getLength(); i++) {
-                if (RRuntime.isNA(getDataAt(i))) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
     @Override
     public double getDataAt(int index) {
         return NativeDataAccess.getData(this, data, index);
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RIntVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RIntVector.java
index 450619ae328cc4fc651def3802f51f53a819dff1..17a03fc109ffdb06804919ad7e20376ae49d0f08 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RIntVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RIntVector.java
@@ -44,7 +44,7 @@ public final class RIntVector extends RVector<int[]> implements RAbstractIntVect
     RIntVector(int[] data, boolean complete) {
         super(complete);
         this.data = data;
-        assert verify();
+        assert RAbstractVector.verify(this);
     }
 
     RIntVector(int[] data, boolean complete, int[] dims, RStringVector names, RList dimNames) {
@@ -134,18 +134,6 @@ public final class RIntVector extends RVector<int[]> implements RAbstractIntVect
         return NativeDataAccess.getDataLength(this, data);
     }
 
-    @Override
-    public boolean verify() {
-        if (isComplete()) {
-            for (int i = 0; i < getLength(); i++) {
-                if (RRuntime.isNA(getDataAt(i))) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
     @Override
     public int[] getDataCopy() {
         if (data != null) {
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RListBase.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RListBase.java
index 504c6d41736f379caba1fb6be7ba138c84e7909f..f672375dec1e61b7580f9ab933f1256fa133365f 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RListBase.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RListBase.java
@@ -52,7 +52,7 @@ public abstract class RListBase extends RVector<Object[]> implements RAbstractLi
     RListBase(Object[] data) {
         super(false);
         this.data = data;
-        assert verify();
+        assert RAbstractVector.verify(this);
     }
 
     RListBase(Object[] data, int[] dims, RStringVector names, RList dimNames) {
@@ -93,16 +93,6 @@ public abstract class RListBase extends RVector<Object[]> implements RAbstractLi
         ((Object[]) store)[index] = value;
     }
 
-    @Override
-    public final boolean verify() {
-        for (Object item : data) {
-            if (item == null) {
-                return false;
-            }
-        }
-        return true;
-    }
-
     @Override
     public Object[] getInternalManagedData() {
         return data;
@@ -187,11 +177,6 @@ public abstract class RListBase extends RVector<Object[]> implements RAbstractLi
         return newData;
     }
 
-    @Override
-    public final boolean checkCompleteness() {
-        return true;
-    }
-
     @Override
     public final void setElement(int i, Object value) {
         data[i] = value;
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLogicalVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLogicalVector.java
index 048c4df3c36edce15fde06bd28ebb359229ddab3..8e097a7a97a430f0e34301f0e884ae43b44e47d4 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLogicalVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RLogicalVector.java
@@ -44,7 +44,7 @@ public final class RLogicalVector extends RVector<byte[]> implements RAbstractLo
     RLogicalVector(byte[] data, boolean complete) {
         super(complete);
         this.data = data;
-        assert verify();
+        assert RAbstractVector.verify(this);
     }
 
     RLogicalVector(byte[] data, boolean complete, int[] dims, RStringVector names, RList dimNames) {
@@ -136,18 +136,6 @@ public final class RLogicalVector extends RVector<byte[]> implements RAbstractLo
         return NativeDataAccess.getDataLength(this, data);
     }
 
-    @Override
-    public boolean verify() {
-        if (isComplete()) {
-            for (int i = 0; i < getLength(); i++) {
-                if (RRuntime.isNA(getDataAt(i))) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
     @Override
     public byte getDataAt(int index) {
         return NativeDataAccess.getData(this, data, index);
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RRawVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RRawVector.java
index d953368972fabada7ca055075c28f3a11f174569..8da699c972bc7448564d0178c33d9e7079b15c40 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RRawVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RRawVector.java
@@ -43,7 +43,7 @@ public final class RRawVector extends RVector<byte[]> implements RAbstractRawVec
     RRawVector(byte[] data) {
         super(true);
         this.data = data;
-        assert verify();
+        assert RAbstractVector.verify(this);
     }
 
     RRawVector(byte[] data, int[] dims, RStringVector names, RList dimNames) {
@@ -119,11 +119,6 @@ public final class RRawVector extends RVector<byte[]> implements RAbstractRawVec
         return NativeDataAccess.getDataLength(this, data);
     }
 
-    @Override
-    public boolean verify() {
-        return true;
-    }
-
     @Override
     public byte[] getDataCopy() {
         if (data != null) {
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RScalarVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RScalarVector.java
index 76ce7c6cfb8fcebd4d0e36070b7b81c4408df3b8..314b58af2dc90e4c1b3cf5653ab364312bf15f14 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RScalarVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RScalarVector.java
@@ -175,9 +175,4 @@ public abstract class RScalarVector extends RScalar implements RAbstractVector {
     public boolean isArray() {
         return false;
     }
-
-    @Override
-    public final boolean checkCompleteness() {
-        return isComplete();
-    }
 }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RSequence.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RSequence.java
index 8781775fadc4f7191059b85344f8b23a3f473692..f9a75146fe100015669b7696d0c07fe4169de795 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RSequence.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RSequence.java
@@ -65,11 +65,6 @@ public abstract class RSequence implements RAbstractVector {
         return true;
     }
 
-    @Override
-    public boolean checkCompleteness() {
-        return true;
-    }
-
     @Override
     public void setComplete(boolean complete) {
         // sequences are always complete
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RStringVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RStringVector.java
index 682431c3822ab0148602ee50de5bcbaf029cf72c..ee59d39da0552ac2d5483e9b28c762e12bbbfcf0 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RStringVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RStringVector.java
@@ -45,7 +45,7 @@ public final class RStringVector extends RVector<String[]> implements RAbstractS
     RStringVector(String[] data, boolean complete) {
         super(complete);
         this.data = data;
-        assert verify();
+        assert RAbstractVector.verify(this);
     }
 
     RStringVector(String[] data, boolean complete, int[] dims, RStringVector names, RList dimNames) {
@@ -127,18 +127,6 @@ public final class RStringVector extends RVector<String[]> implements RAbstractS
         return data;
     }
 
-    @Override
-    public boolean verify() {
-        if (isComplete()) {
-            for (String b : data) {
-                if (b == RRuntime.STRING_NA) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
     @Override
     public String getDataAt(int i) {
         return data[i];
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RVector.java
index 47b40aec93ea685560373b1f496bf83e0ccfee57..2e2b076c975bf3fb8b2bf88d6582cc73b76c82a2 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RVector.java
@@ -31,7 +31,6 @@ import com.oracle.truffle.api.object.DynamicObject;
 import com.oracle.truffle.r.runtime.RError;
 import com.oracle.truffle.r.runtime.RInternalError;
 import com.oracle.truffle.r.runtime.RRuntime;
-import com.oracle.truffle.r.runtime.RType;
 import com.oracle.truffle.r.runtime.SuppressFBWarnings;
 import com.oracle.truffle.r.runtime.data.model.RAbstractContainer;
 import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector;
@@ -59,9 +58,6 @@ import com.oracle.truffle.r.runtime.ops.na.NACheck;
  */
 public abstract class RVector<ArrayT> extends RSharingAttributeStorage implements RAbstractVector, RFFIAccess {
 
-    private static final RStringVector implicitClassHeaderArray = RDataFactory.createStringVector(new String[]{RType.Array.getName()}, true);
-    private static final RStringVector implicitClassHeaderMatrix = RDataFactory.createStringVector(new String[]{RType.Matrix.getName()}, true);
-
     protected boolean complete; // "complete" means: does not contain NAs
 
     protected RVector(boolean complete) {
@@ -140,7 +136,7 @@ public abstract class RVector<ArrayT> extends RSharingAttributeStorage implement
     @Override
     public final void setComplete(boolean complete) {
         this.complete = complete;
-        assert verify();
+        assert RAbstractVector.verify(this);
     }
 
     private void removeAttributeMapping(String key) {
@@ -537,8 +533,6 @@ public abstract class RVector<ArrayT> extends RSharingAttributeStorage implement
 
     protected abstract RVector<ArrayT> internalCopy();
 
-    public abstract boolean verify();
-
     /**
      * Update a data item in the vector. Possibly not as efficient as type-specific methods, but in
      * some cases it likely does not matter (e.g. if used alongside I/O operations).
@@ -751,18 +745,6 @@ public abstract class RVector<ArrayT> extends RSharingAttributeStorage implement
         }
     }
 
-    // As shape of the vector may change at run-time we need to compute
-    // class hierarchy on the fly.
-    protected final RStringVector getClassHierarchyHelper(RStringVector implicitClassHeader) {
-        if (isMatrix()) {
-            return implicitClassHeaderMatrix;
-        }
-        if (isArray()) {
-            return implicitClassHeaderArray;
-        }
-        return implicitClassHeader;
-    }
-
     public static void verifyDimensions(int vectorLength, int[] newDimensions, RBaseNode invokingNode) {
         int length = 1;
         for (int i = 0; i < newDimensions.length; i++) {
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractComplexVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractComplexVector.java
index 4e1a9ef4866d2deb895723fbfbce7e44fb5efaf6..930526998fc0672d6b855b6ff55be175aafc5399 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractComplexVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractComplexVector.java
@@ -22,7 +22,6 @@
  */
 package com.oracle.truffle.r.runtime.data.model;
 
-import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.RType;
 import com.oracle.truffle.r.runtime.data.RComplex;
 import com.oracle.truffle.r.runtime.data.RComplexVector;
@@ -44,16 +43,6 @@ public interface RAbstractComplexVector extends RAbstractAtomicVector {
         throw new UnsupportedOperationException();
     }
 
-    @Override
-    default boolean checkCompleteness() {
-        for (int i = 0; i < getLength(); i++) {
-            if (RRuntime.isNA(getDataAt(i))) {
-                return false;
-            }
-        }
-        return true;
-    }
-
     @Override
     default RType getRType() {
         return RType.Complex;
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractDoubleVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractDoubleVector.java
index ab8c782a3f97d0e8882eb8d551d50debf22905f0..c223c64054322e529a90b95aa7604c89c0cd24e7 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractDoubleVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractDoubleVector.java
@@ -22,7 +22,6 @@
  */
 package com.oracle.truffle.r.runtime.data.model;
 
-import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.RType;
 import com.oracle.truffle.r.runtime.data.RDoubleVector;
 
@@ -47,16 +46,6 @@ public interface RAbstractDoubleVector extends RAbstractAtomicVector {
     @Override
     RDoubleVector materialize();
 
-    @Override
-    default boolean checkCompleteness() {
-        for (int i = 0; i < getLength(); i++) {
-            if (RRuntime.isNA(getDataAt(i))) {
-                return false;
-            }
-        }
-        return true;
-    }
-
     @Override
     default RType getRType() {
         return RType.Double;
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractIntVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractIntVector.java
index 92401aea21e6a7f5a42f0c130ab62b3c716806ce..727f43772b68078cd1061ee364a1c6185a5ffabb 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractIntVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractIntVector.java
@@ -22,7 +22,6 @@
  */
 package com.oracle.truffle.r.runtime.data.model;
 
-import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.RType;
 import com.oracle.truffle.r.runtime.data.RIntVector;
 
@@ -47,16 +46,6 @@ public interface RAbstractIntVector extends RAbstractAtomicVector {
     @Override
     RIntVector materialize();
 
-    @Override
-    default boolean checkCompleteness() {
-        for (int i = 0; i < getLength(); i++) {
-            if (RRuntime.isNA(getDataAt(i))) {
-                return false;
-            }
-        }
-        return true;
-    }
-
     @Override
     default RType getRType() {
         return RType.Integer;
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractListBaseVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractListBaseVector.java
index ea019fe0a4d23b6cd5a43837a78d79f5b1095925..e6f99db40e80746821447236403f97d8655b4315 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractListBaseVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractListBaseVector.java
@@ -35,9 +35,4 @@ public interface RAbstractListBaseVector extends RAbstractVector {
     default void setDataAt(Object store, int index, Object value) {
         throw new UnsupportedOperationException();
     }
-
-    @Override
-    default boolean checkCompleteness() {
-        return true;
-    }
 }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractLogicalVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractLogicalVector.java
index 2a1c503de5361dcd250c061344b5c621f97c0e8a..ff0ac5f5732aa924f1c6e86a7b4da6e2079d1dd6 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractLogicalVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractLogicalVector.java
@@ -22,7 +22,6 @@
  */
 package com.oracle.truffle.r.runtime.data.model;
 
-import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.RType;
 import com.oracle.truffle.r.runtime.data.RLogicalVector;
 
@@ -47,16 +46,6 @@ public interface RAbstractLogicalVector extends RAbstractAtomicVector {
     @Override
     RLogicalVector materialize();
 
-    @Override
-    default boolean checkCompleteness() {
-        for (int i = 0; i < getLength(); i++) {
-            if (RRuntime.isNA(getDataAt(i))) {
-                return false;
-            }
-        }
-        return true;
-    }
-
     @Override
     default RType getRType() {
         return RType.Logical;
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractRawVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractRawVector.java
index 53f2c49bd1d3ab1402ba5f9622ed7c32434bf6f8..f76d746806f59a662716945e38833fe32abe671c 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractRawVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractRawVector.java
@@ -43,11 +43,6 @@ public interface RAbstractRawVector extends RAbstractAtomicVector {
     @Override
     RRawVector materialize();
 
-    @Override
-    default boolean checkCompleteness() {
-        return true;
-    }
-
     @Override
     default RType getRType() {
         return RType.Raw;
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractStringVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractStringVector.java
index af93f141e09f2791c2e7fcc4b809b2302ce22355..c6e5f960d14c5c54ded61a751aef5c19cc2d46a8 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractStringVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractStringVector.java
@@ -22,7 +22,6 @@
  */
 package com.oracle.truffle.r.runtime.data.model;
 
-import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.RType;
 import com.oracle.truffle.r.runtime.data.RStringVector;
 
@@ -47,16 +46,6 @@ public interface RAbstractStringVector extends RAbstractAtomicVector {
     @Override
     RStringVector materialize();
 
-    @Override
-    default boolean checkCompleteness() {
-        for (int i = 0; i < getLength(); i++) {
-            if (RRuntime.isNA(getDataAt(i))) {
-                return false;
-            }
-        }
-        return true;
-    }
-
     @Override
     default RType getRType() {
         return RType.Character;
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractVector.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractVector.java
index e5fe39c6a8072bf343a0f169dfe81af770a1acd1..43039d80a1facd3c392b8cf758a7f46f97081d96 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractVector.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/model/RAbstractVector.java
@@ -22,10 +22,13 @@
  */
 package com.oracle.truffle.r.runtime.data.model;
 
+import com.oracle.truffle.api.CompilerAsserts;
 import com.oracle.truffle.api.profiles.ConditionProfile;
 import com.oracle.truffle.r.runtime.RType;
 import com.oracle.truffle.r.runtime.data.MemoryCopyTracer;
 import com.oracle.truffle.r.runtime.data.RVector;
+import com.oracle.truffle.r.runtime.data.nodes.VectorAccess;
+import com.oracle.truffle.r.runtime.data.nodes.VectorAccess.SequentialIterator;
 
 /**
  * When implementing, make sure to invoke related {@link MemoryCopyTracer} methods.
@@ -62,8 +65,6 @@ public interface RAbstractVector extends RAbstractContainer {
 
     boolean isArray();
 
-    boolean checkCompleteness();
-
     /**
      * Casts a vector to another {@link RType}. If a safe cast to the target {@link RType} is not
      * supported <code>null</code> is returned. Instead of materializing the cast for each index the
@@ -99,4 +100,31 @@ public interface RAbstractVector extends RAbstractContainer {
     }
 
     void setComplete(boolean complete);
+
+    /**
+     * Verifies the integrity of the vector, mainly whether a vector that claims to be
+     * {@link #isComplete()} contains NA values.
+     */
+    static boolean verify(RAbstractVector vector) {
+        CompilerAsserts.neverPartOfCompilation();
+        VectorAccess access = vector.slowPathAccess();
+        assert access.getType().isVector();
+        if (!access.getType().isAtomic()) {
+            // check non-atomic vectors for nullness
+            try (SequentialIterator iter = access.access(vector)) {
+                while (access.next(iter)) {
+                    assert access.getListElement(iter) != null : "element " + iter.getIndex() + " of vector " + vector + " is null";
+                }
+            }
+        }
+        if (vector.isComplete()) {
+            // check all vectors for completeness
+            try (SequentialIterator iter = access.access(vector)) {
+                while (access.next(iter)) {
+                    assert !access.isNA(iter) : "element " + iter.getIndex() + " of vector " + vector + " is NA";
+                }
+            }
+        }
+        return true;
+    }
 }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/nodes/VectorAccess.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/nodes/VectorAccess.java
index 27bba89617efd2e283c08797c865ac62d2293808..faa2dfb98cf92f29066b8402f14a360efb33cf20 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/nodes/VectorAccess.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/nodes/VectorAccess.java
@@ -436,33 +436,38 @@ public abstract class VectorAccess extends Node {
         return isNA(iter.store, index);
     }
 
-    private static final RStringVector TEMPLATE_CHARACTER = RDataFactory.getPermanent().createStringVector(4);
-    private static final RComplexVector TEMPLATE_COMPLEX = RDataFactory.getPermanent().createComplexVector(4);
-    private static final RDoubleVector TEMPLATE_DOUBLE = RDataFactory.getPermanent().createDoubleVector(4);
-    private static final RIntVector TEMPLATE_INTEGER = RDataFactory.getPermanent().createIntVector(4);
-    private static final RList TEMPLATE_LIST = RDataFactory.getPermanent().createList(4);
-    private static final RExpression TEMPLATE_EXPRESSION = RDataFactory.createExpression(4);
-    private static final RLogicalVector TEMPLATE_LOGICAL = RDataFactory.getPermanent().createLogicalVector(4);
-    private static final RRawVector TEMPLATE_RAW = RDataFactory.getPermanent().createRawVector(4);
+    /**
+     * Placed in a separate class to avoid circular dependencies during class initialization.
+     */
+    private static final class Lazy {
+        private static final RStringVector TEMPLATE_CHARACTER = RDataFactory.getPermanent().createStringVector(4);
+        private static final RComplexVector TEMPLATE_COMPLEX = RDataFactory.getPermanent().createComplexVector(4);
+        private static final RDoubleVector TEMPLATE_DOUBLE = RDataFactory.getPermanent().createDoubleVector(4);
+        private static final RIntVector TEMPLATE_INTEGER = RDataFactory.getPermanent().createIntVector(4);
+        private static final RList TEMPLATE_LIST = RDataFactory.getPermanent().createList(4);
+        private static final RExpression TEMPLATE_EXPRESSION = RDataFactory.createExpression(4);
+        private static final RLogicalVector TEMPLATE_LOGICAL = RDataFactory.getPermanent().createLogicalVector(4);
+        private static final RRawVector TEMPLATE_RAW = RDataFactory.getPermanent().createRawVector(4);
+    }
 
     public static VectorAccess createNew(RType type) {
         switch (type) {
             case Character:
-                return TEMPLATE_CHARACTER.access();
+                return Lazy.TEMPLATE_CHARACTER.access();
             case Complex:
-                return TEMPLATE_COMPLEX.access();
+                return Lazy.TEMPLATE_COMPLEX.access();
             case Double:
-                return TEMPLATE_DOUBLE.access();
+                return Lazy.TEMPLATE_DOUBLE.access();
             case Integer:
-                return TEMPLATE_INTEGER.access();
+                return Lazy.TEMPLATE_INTEGER.access();
             case List:
-                return TEMPLATE_LIST.access();
+                return Lazy.TEMPLATE_LIST.access();
             case Expression:
-                return TEMPLATE_EXPRESSION.access();
+                return Lazy.TEMPLATE_EXPRESSION.access();
             case Logical:
-                return TEMPLATE_LOGICAL.access();
+                return Lazy.TEMPLATE_LOGICAL.access();
             case Raw:
-                return TEMPLATE_RAW.access();
+                return Lazy.TEMPLATE_RAW.access();
             case RInteropChar:
             case RInteropFloat:
             case RInteropLong:
@@ -475,21 +480,21 @@ public abstract class VectorAccess extends Node {
     public static VectorAccess createSlowPathNew(RType type) {
         switch (type) {
             case Character:
-                return TEMPLATE_CHARACTER.slowPathAccess();
+                return Lazy.TEMPLATE_CHARACTER.slowPathAccess();
             case Complex:
-                return TEMPLATE_COMPLEX.slowPathAccess();
+                return Lazy.TEMPLATE_COMPLEX.slowPathAccess();
             case Double:
-                return TEMPLATE_DOUBLE.slowPathAccess();
+                return Lazy.TEMPLATE_DOUBLE.slowPathAccess();
             case Integer:
-                return TEMPLATE_INTEGER.slowPathAccess();
+                return Lazy.TEMPLATE_INTEGER.slowPathAccess();
             case List:
-                return TEMPLATE_LIST.slowPathAccess();
+                return Lazy.TEMPLATE_LIST.slowPathAccess();
             case Expression:
-                return TEMPLATE_EXPRESSION.slowPathAccess();
+                return Lazy.TEMPLATE_EXPRESSION.slowPathAccess();
             case Logical:
-                return TEMPLATE_LOGICAL.slowPathAccess();
+                return Lazy.TEMPLATE_LOGICAL.slowPathAccess();
             case Raw:
-                return TEMPLATE_RAW.slowPathAccess();
+                return Lazy.TEMPLATE_RAW.slowPathAccess();
             case RInteropChar:
             case RInteropFloat:
             case RInteropLong:
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/interop/TruffleObjectConverter.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/interop/TruffleObjectConverter.java
index 96de1c9491927796a27920553135dda2a29bfca2..798006a13b57040f459279e096fa87dbc0b99efd 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/interop/TruffleObjectConverter.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/interop/TruffleObjectConverter.java
@@ -334,11 +334,6 @@ public final class TruffleObjectConverter {
             return false;
         }
 
-        @Override
-        public boolean checkCompleteness() {
-            throw RInternalError.shouldNotReachHere();
-        }
-
         @Override
         public void setComplete(boolean complete) {
             throw RInternalError.shouldNotReachHere();
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ops/na/NACheck.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ops/na/NACheck.java
index cdb561977cb05e699fa4f9c26a0fbe577896a357..31ce4935a26c0e7554abe576565453f55d156ab9 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ops/na/NACheck.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/ops/na/NACheck.java
@@ -172,6 +172,7 @@ public final class NACheck {
     }
 
     public boolean checkListElement(Object value) {
+        assert value != null;
         if (state != NO_CHECK && value == RNull.instance) {
             if (state == CHECK_DEOPT) {
                 CompilerDirectives.transferToInterpreterAndInvalidate();