diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RTypesFlatLayout.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RTypesFlatLayout.java
new file mode 100644
index 0000000000000000000000000000000000000000..ed769f7b79bb5da49e260d32d43b057406d81318
--- /dev/null
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RTypesFlatLayout.java
@@ -0,0 +1,303 @@
+/*
+ * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.oracle.truffle.r.runtime.data;
+
+import com.oracle.truffle.api.dsl.ImplicitCast;
+import com.oracle.truffle.api.dsl.TypeCast;
+import com.oracle.truffle.api.dsl.TypeCheck;
+import com.oracle.truffle.api.dsl.TypeSystem;
+import com.oracle.truffle.api.dsl.internal.DSLOptions;
+import com.oracle.truffle.api.dsl.internal.DSLOptions.DSLGenerator;
+import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector;
+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.RAbstractLogicalVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractRawVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector;
+import com.oracle.truffle.r.runtime.data.model.RAbstractVector;
+import com.oracle.truffle.r.runtime.nodes.RNode;
+
+/**
+ * Whenever you add a type {@code T} to the list below, make sure a corresponding {@code executeT()}
+ * method is added to {@link RNode}, a {@code typeof} method is added to {@code TypeoNode} and a
+ * {@code print} method added to {code PrettyPrinterNode}.
+ *
+ * @see RNode
+ */
+@TypeSystem({byte.class, int.class, double.class})
+@DSLOptions(defaultGenerator = DSLGenerator.FLAT)
+public class RTypesFlatLayout {
+
+    @TypeCheck(RNull.class)
+    public static boolean isRNull(Object value) {
+        return value == RNull.instance;
+    }
+
+    @TypeCast(RNull.class)
+    @SuppressWarnings("unused")
+    public static RNull asRNull(Object value) {
+        return RNull.instance;
+    }
+
+    @TypeCheck(RMissing.class)
+    public static boolean isRMissing(Object value) {
+        return value == RMissing.instance;
+    }
+
+    @TypeCast(RMissing.class)
+    @SuppressWarnings("unused")
+    public static RMissing asRMissing(Object value) {
+        return RMissing.instance;
+    }
+
+    @ImplicitCast
+    public static RAbstractContainer toAbstractContainer(int value) {
+        return RDataFactory.createIntVectorFromScalar(value);
+    }
+
+    @ImplicitCast
+    public static RAbstractContainer toAbstractContainer(double value) {
+        return RDataFactory.createDoubleVectorFromScalar(value);
+    }
+
+    @ImplicitCast
+    public static RAbstractContainer toAbstractContainer(RRaw value) {
+        return RDataFactory.createRawVectorFromScalar(value);
+    }
+
+    @ImplicitCast
+    public static RAbstractContainer toAbstractContainer(byte value) {
+        return RDataFactory.createLogicalVectorFromScalar(value);
+    }
+
+    @ImplicitCast
+    public static RAbstractContainer toAbstractContainer(RComplex value) {
+        return RDataFactory.createComplexVectorFromScalar(value);
+    }
+
+    @ImplicitCast
+    public static RAbstractContainer toAbstractContainer(String value) {
+        return RDataFactory.createStringVectorFromScalar(value);
+    }
+
+    @ImplicitCast
+    public static RAbstractContainer toAbstractContainer(RIntVector vector) {
+        return vector;
+    }
+
+    @ImplicitCast
+    public static RAbstractContainer toAbstractContainer(RDoubleVector vector) {
+        return vector;
+    }
+
+    @ImplicitCast
+    public static RAbstractContainer toAbstractContainer(RLogicalVector vector) {
+        return vector;
+    }
+
+    @ImplicitCast
+    public static RAbstractContainer toAbstractContainer(RComplexVector vector) {
+        return vector;
+    }
+
+    @ImplicitCast
+    public static RAbstractContainer toAbstractContainer(RRawVector vector) {
+        return vector;
+    }
+
+    @ImplicitCast
+    public static RAbstractContainer toAbstractContainer(RStringVector vector) {
+        return vector;
+    }
+
+    @ImplicitCast
+    public static RAbstractContainer toAbstractContainer(RIntSequence vector) {
+        return vector;
+    }
+
+    @ImplicitCast
+    public static RAbstractContainer toAbstractContainer(RDoubleSequence vector) {
+        return vector;
+    }
+
+    @ImplicitCast
+    public static RAbstractContainer toAbstractContainer(RList vector) {
+        return vector;
+    }
+
+    @ImplicitCast
+    public static RAbstractContainer toAbstractContainer(RAbstractVector vector) {
+        return vector;
+    }
+
+    @ImplicitCast
+    public static RAbstractVector toAbstractVector(int value) {
+        return RDataFactory.createIntVectorFromScalar(value);
+    }
+
+    @ImplicitCast
+    public static RAbstractVector toAbstractVector(double value) {
+        return RDataFactory.createDoubleVectorFromScalar(value);
+    }
+
+    @ImplicitCast
+    public static RAbstractVector toAbstractVector(RRaw value) {
+        return RDataFactory.createRawVectorFromScalar(value);
+    }
+
+    @ImplicitCast
+    public static RAbstractVector toAbstractVector(byte value) {
+        return RDataFactory.createLogicalVectorFromScalar(value);
+    }
+
+    @ImplicitCast
+    public static RAbstractVector toAbstractVector(RComplex value) {
+        return RDataFactory.createComplexVectorFromScalar(value);
+    }
+
+    @ImplicitCast
+    public static RAbstractVector toAbstractVector(String value) {
+        return RDataFactory.createStringVectorFromScalar(value);
+    }
+
+    @ImplicitCast
+    public static RAbstractVector toAbstractVector(RIntVector vector) {
+        return vector;
+    }
+
+    @ImplicitCast
+    public static RAbstractVector toAbstractVector(RDoubleVector vector) {
+        return vector;
+    }
+
+    @ImplicitCast
+    public static RAbstractVector toAbstractVector(RLogicalVector vector) {
+        return vector;
+    }
+
+    @ImplicitCast
+    public static RAbstractVector toAbstractVector(RComplexVector vector) {
+        return vector;
+    }
+
+    @ImplicitCast
+    public static RAbstractVector toAbstractVector(RRawVector vector) {
+        return vector;
+    }
+
+    @ImplicitCast
+    public static RAbstractVector toAbstractVector(RStringVector vector) {
+        return vector;
+    }
+
+    @ImplicitCast
+    public static RAbstractVector toAbstractVector(RIntSequence vector) {
+        return vector;
+    }
+
+    @ImplicitCast
+    public static RAbstractVector toAbstractVector(RDoubleSequence vector) {
+        return vector;
+    }
+
+    @ImplicitCast
+    public static RAbstractVector toAbstractVector(RList vector) {
+        return vector;
+    }
+
+    @ImplicitCast
+    public static RAbstractIntVector toAbstractIntVector(int value) {
+        return RDataFactory.createIntVectorFromScalar(value);
+    }
+
+    @ImplicitCast
+    public static RAbstractIntVector toAbstractIntVector(RIntSequence vector) {
+        return vector;
+    }
+
+    @ImplicitCast
+    public static RAbstractIntVector toAbstractIntVector(RIntVector vector) {
+        return vector;
+    }
+
+    @ImplicitCast
+    public static RAbstractDoubleVector toAbstractDoubleVector(double value) {
+        return RDataFactory.createDoubleVectorFromScalar(value);
+    }
+
+    @ImplicitCast
+    public static RAbstractDoubleVector toAbstractDoubleVector(RDoubleSequence vector) {
+        return vector;
+    }
+
+    @ImplicitCast
+    public static RAbstractDoubleVector toAbstractDoubleVector(RDoubleVector vector) {
+        return vector;
+    }
+
+    @ImplicitCast
+    public static RAbstractComplexVector toAbstractComplexVector(RComplexVector vector) {
+        return vector;
+    }
+
+    @ImplicitCast
+    public static RAbstractComplexVector toAbstractComplexVector(RComplex vector) {
+        return RDataFactory.createComplexVectorFromScalar(vector);
+    }
+
+    @ImplicitCast
+    public static RAbstractLogicalVector toAbstractLogicalVector(byte vector) {
+        return RDataFactory.createLogicalVectorFromScalar(vector);
+    }
+
+    @ImplicitCast
+    public static RAbstractLogicalVector toAbstractLogicalVector(RLogicalVector vector) {
+        return vector;
+    }
+
+    @ImplicitCast
+    public static RAbstractRawVector toAbstractRawVector(RRaw vector) {
+        return RDataFactory.createRawVectorFromScalar(vector);
+    }
+
+    @ImplicitCast
+    public static RAbstractRawVector toAbstractRawVector(RRawVector vector) {
+        return vector;
+    }
+
+    @ImplicitCast
+    public static RAbstractStringVector toAbstractStringVector(String vector) {
+        return RDataFactory.createStringVectorFromScalar(vector);
+    }
+
+    @ImplicitCast
+    public static RAbstractStringVector toAbstractStringVector(RStringVector vector) {
+        return vector;
+    }
+
+    @ImplicitCast
+    public static RMissing toRMissing(@SuppressWarnings("unused") REmpty empty) {
+        return RMissing.instance;
+    }
+}