diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/TruffleRLanguageImpl.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/TruffleRLanguageImpl.java
index e47345b70469600ebcdec25fe2fafa178f3a8977..e84096fba53c49263117a1cf1e4ec25ff356c8b1 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/TruffleRLanguageImpl.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/TruffleRLanguageImpl.java
@@ -217,12 +217,6 @@ public final class TruffleRLanguageImpl extends TruffleRLanguage {
         }
     }
 
-    @Override
-    protected Object getLanguageGlobal(RContext context) {
-        // TODO: what's the meaning of "language global" for R?
-        return null;
-    }
-
     public static RContext getCurrentContext() {
         return TruffleLanguage.getCurrentContext(TruffleRLanguage.class);
     }
diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ListMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ListMR.java
index 8110560bfac52c394462ba63cd59e850d0dc5aa3..17611a0c03a3d658dd229a03d5ae8dcd4802f329 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ListMR.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/ListMR.java
@@ -29,7 +29,6 @@ import com.oracle.truffle.api.dsl.Specialization;
 import com.oracle.truffle.api.frame.VirtualFrame;
 import com.oracle.truffle.api.interop.CanResolve;
 import com.oracle.truffle.api.interop.KeyInfo;
-import com.oracle.truffle.api.interop.KeyInfo.Builder;
 import com.oracle.truffle.api.interop.MessageResolution;
 import com.oracle.truffle.api.interop.Resolve;
 import com.oracle.truffle.api.interop.TruffleObject;
@@ -476,9 +475,11 @@ public class ListMR {
         }
 
         private static int buildKeys(Object value) {
-            Builder builder = KeyInfo.newBuilder();
-            builder.setReadable(true).setWritable(true).setInvocable(value instanceof RFunction);
-            return builder.build();
+            int result = KeyInfo.READABLE | KeyInfo.MODIFIABLE;
+            if (value instanceof RFunction) {
+                result |= KeyInfo.INVOCABLE;
+            }
+            return result;
         }
 
         private void initExtractNode() {
diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RAbstractVectorAccessFactory.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RAbstractVectorAccessFactory.java
index 71f967bff098ada7715caa6243e63e75a9ebe3b9..fec7058df22ad8468e976f936a6f47c9800735cf 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RAbstractVectorAccessFactory.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RAbstractVectorAccessFactory.java
@@ -280,9 +280,7 @@ public final class RAbstractVectorAccessFactory implements StandardFactory {
             if (unknownIdentifier.profile(idx < 0 || idx >= lengthNode.executeInteger(receiver))) {
                 return 0;
             }
-            KeyInfo.Builder builder = KeyInfo.newBuilder();
-            builder.setReadable(true).setWritable(true);
-            return builder.build();
+            return KeyInfo.READABLE | KeyInfo.MODIFIABLE;
         }
 
         @Fallback
diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RArgsValuesAndNamesMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RArgsValuesAndNamesMR.java
index 41d74de381bcf61c03a5c62e0c39dd70db9be2e3..70ef6ffa40537c3da3e8c414ec9d3bbf7fc9aa4d 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RArgsValuesAndNamesMR.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RArgsValuesAndNamesMR.java
@@ -193,9 +193,8 @@ public class RArgsValuesAndNamesMR {
         }
 
         private static Object createKeyInfo(RArgsValuesAndNames receiver, int idx) {
-            KeyInfo.Builder builder = KeyInfo.newBuilder();
-            builder.setReadable(true).setInvocable(receiver.getArgument(idx) instanceof RFunction);
-            return builder.build();
+            int invocable = receiver.getArgument(idx) instanceof RFunction ? KeyInfo.INVOCABLE : 0;
+            return KeyInfo.READABLE | invocable;
         }
 
         @Fallback
diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/REnvironmentMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/REnvironmentMR.java
index 31246b547d4d2212875d1cba32709e9e2974ddd8..f53da4a554de3776f26857d0dbc47ace227c45ba 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/REnvironmentMR.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/REnvironmentMR.java
@@ -29,7 +29,6 @@ import com.oracle.truffle.api.dsl.Specialization;
 import com.oracle.truffle.api.frame.VirtualFrame;
 import com.oracle.truffle.api.interop.CanResolve;
 import com.oracle.truffle.api.interop.KeyInfo;
-import com.oracle.truffle.api.interop.KeyInfo.Builder;
 import com.oracle.truffle.api.interop.Message;
 import com.oracle.truffle.api.interop.MessageResolution;
 import com.oracle.truffle.api.interop.Resolve;
@@ -212,13 +211,14 @@ public class REnvironmentMR {
             if (val == null) {
                 return 0;
             }
-            Builder builder = KeyInfo.newBuilder();
-            builder.setReadable(true);
+            int result = KeyInfo.READABLE;
             if (!receiver.isLocked() && !receiver.bindingIsLocked(identifier)) {
-                builder.setWritable(true);
+                result |= KeyInfo.MODIFIABLE;
             }
-            builder.setInvocable(val instanceof RFunction);
-            return builder.build();
+            if (val instanceof RFunction) {
+                result |= KeyInfo.INVOCABLE;
+            }
+            return result;
         }
 
         @Fallback
diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RLanguageMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RLanguageMR.java
index 5861a235f3f7bbd3fd09d4d03f0a6204d9238524..d6f5b6b3f83dffb8e9d5df41452b598bc5e9a25f 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RLanguageMR.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RLanguageMR.java
@@ -155,11 +155,8 @@ public class RLanguageMR {
             if (unknownIdentifier.profile(idx < 0 || idx >= receiver.getLength())) {
                 return 0;
             }
-
-            KeyInfo.Builder builder = KeyInfo.newBuilder();
-            builder.setReadable(true);
             // TODO what about writeble/invocable/...
-            return builder.build();
+            return KeyInfo.READABLE;
         }
 
         @Fallback
diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RPromiseMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RPromiseMR.java
index 07fa19481efe5bd0ae7cd5977d436cb271a25ae3..9d5d4578293e1b7122d8786eb7d05ff8089f87b3 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RPromiseMR.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RPromiseMR.java
@@ -172,9 +172,9 @@ public class RPromiseMR {
         @Specialization
         protected Object access(@SuppressWarnings("unused") RPromise receiver, String identifier) {
             if (PROP_EXPR.equals(identifier) || PROP_VALUE.equals(identifier)) {
-                return KeyInfo.newBuilder().setReadable(true).build();
+                return KeyInfo.READABLE;
             } else if (PROP_IS_EVALUATED.equals(identifier)) {
-                return KeyInfo.newBuilder().setReadable(true).setWritable(true).build();
+                return KeyInfo.READABLE | KeyInfo.MODIFIABLE;
             } else {
                 return 0;
             }
diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RS4ObjectMR.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RS4ObjectMR.java
index ff7122e0faae9b8585bc6caff38f9e84561ca89e..db48f8916a19b9ea45d0a58226ddf320ad34f638 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RS4ObjectMR.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/interop/RS4ObjectMR.java
@@ -28,7 +28,6 @@ import com.oracle.truffle.api.dsl.Fallback;
 import com.oracle.truffle.api.dsl.Specialization;
 import com.oracle.truffle.api.interop.CanResolve;
 import com.oracle.truffle.api.interop.KeyInfo;
-import com.oracle.truffle.api.interop.KeyInfo.Builder;
 import com.oracle.truffle.api.interop.Message;
 import com.oracle.truffle.api.interop.MessageResolution;
 import com.oracle.truffle.api.interop.Resolve;
@@ -233,10 +232,9 @@ public class RS4ObjectMR {
                 CompilerDirectives.transferToInterpreterAndInvalidate();
                 getAttributeNode = insert(GetAttributeNode.create());
             }
-            Builder builder = KeyInfo.newBuilder();
-            builder.setReadable(true).setWritable(!identifier.equals("class"));
-            builder.setInvocable(getAttributeNode.execute(receiver, identifier) instanceof RFunction);
-            return builder.build();
+            int writeable = !identifier.equals("class") ? KeyInfo.MODIFIABLE : 0;
+            int executable = getAttributeNode.execute(receiver, identifier) instanceof RFunction ? KeyInfo.INVOCABLE : 0;
+            return KeyInfo.READABLE | writeable | executable;
         }
 
         protected static ArrayAttributeNode createArrayAttributeNode() {
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/env/RScope.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/env/RScope.java
index cb2d3141e1525acdea87c27561bcf6c0a0b3ff56..6f7f5c8e225d06648bc00b9ce41cbb411be430db 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/env/RScope.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/env/RScope.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2018, 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
@@ -32,7 +32,6 @@ import com.oracle.truffle.api.frame.Frame;
 import com.oracle.truffle.api.frame.MaterializedFrame;
 import com.oracle.truffle.api.interop.ForeignAccess;
 import com.oracle.truffle.api.interop.KeyInfo;
-import com.oracle.truffle.api.interop.KeyInfo.Builder;
 import com.oracle.truffle.api.interop.Message;
 import com.oracle.truffle.api.interop.MessageResolution;
 import com.oracle.truffle.api.interop.Resolve;
@@ -236,16 +235,14 @@ public final class RScope {
             public abstract static class VarMapsKeyInfoNode extends Node {
 
                 protected Object access(VariablesObject receiver, String identifier) {
-                    Builder builder = KeyInfo.newBuilder();
-                    builder.setReadable(true);
-
+                    int result = KeyInfo.READABLE;
                     if (!receiver.frameAccess.bindingIsLocked(identifier)) {
-                        builder.setWritable(true);
+                        result |= KeyInfo.MODIFIABLE;
                     }
                     if (receiver.frameAccess.get(identifier) instanceof RFunction) {
-                        builder.setInvocable(true);
+                        result |= KeyInfo.INVOCABLE;
                     }
-                    return builder.build();
+                    return result;
                 }
             }
 
@@ -356,8 +353,7 @@ public final class RScope {
             @Resolve(message = "HAS_SIZE")
             abstract static class ArgNamesHasSizeNode extends Node {
 
-                @SuppressWarnings("unused")
-                public Object access(ArgumentNamesObject varNames) {
+                public Object access(@SuppressWarnings("unused") ArgumentNamesObject varNames) {
                     return true;
                 }
             }