diff --git a/editors/code/src/client.ts b/editors/code/src/client.ts
index 08d821dd0a8..82ca749f306 100644
--- a/editors/code/src/client.ts
+++ b/editors/code/src/client.ts
@@ -99,8 +99,10 @@ export async function createClient(config: Config, serverPath: string): Promise<
     // Note that while the CallHierarchyFeature is stable the LSP protocol is not.
     res.registerFeature(new CallHierarchyFeature(res));
 
-    if (config.highlightingSemanticTokens) {
-        res.registerFeature(new SemanticTokensFeature(res));
+    if (config.package.enableProposedApi) {
+        if (config.highlightingSemanticTokens) {
+            res.registerFeature(new SemanticTokensFeature(res));
+        }
     }
 
     return res;
diff --git a/editors/code/src/config.ts b/editors/code/src/config.ts
index be5296fcff8..602538ea177 100644
--- a/editors/code/src/config.ts
+++ b/editors/code/src/config.ts
@@ -38,17 +38,11 @@ export class Config {
     ]
         .map(opt => `${this.rootSection}.${opt}`);
 
-    readonly packageJsonVersion: string = vscode
-        .extensions
-        .getExtension(this.extensionId)!
-        .packageJSON
-        .version;
-
-    readonly releaseTag: string | undefined = vscode
-        .extensions
-        .getExtension(this.extensionId)!
-        .packageJSON
-        .releaseTag ?? undefined;
+    readonly package: {
+        version: string;
+        releaseTag: string | undefined;
+        enableProposedApi: boolean | undefined;
+    } = vscode.extensions.getExtension(this.extensionId)!.packageJSON;
 
     private cfg!: vscode.WorkspaceConfiguration;
 
@@ -62,7 +56,7 @@ export class Config {
         const enableLogging = this.cfg.get("trace.extension") as boolean;
         log.setEnabled(enableLogging);
         log.debug(
-            "Extension version:", this.packageJsonVersion,
+            "Extension version:", this.package.version,
             "using configuration:", this.cfg
         );
     }
diff --git a/editors/code/src/main.ts b/editors/code/src/main.ts
index 5d2da9a764f..7b7c19dfcf0 100644
--- a/editors/code/src/main.ts
+++ b/editors/code/src/main.ts
@@ -110,9 +110,9 @@ async function bootstrap(config: Config, state: PersistentState): Promise<string
 }
 
 async function bootstrapExtension(config: Config, state: PersistentState): Promise<void> {
-    if (config.releaseTag === undefined) return;
+    if (config.package.releaseTag === undefined) return;
     if (config.channel === "stable") {
-        if (config.releaseTag === NIGHTLY_TAG) {
+        if (config.package.releaseTag === NIGHTLY_TAG) {
             vscode.window.showWarningMessage(`You are running a nightly version of rust-analyzer extension.
 To switch to stable, uninstall the extension and re-install it from the marketplace`);
         }
@@ -185,7 +185,7 @@ async function getServer(config: Config, state: PersistentState): Promise<string
         }
         return explicitPath;
     };
-    if (config.releaseTag === undefined) return "rust-analyzer";
+    if (config.package.releaseTag === undefined) return "rust-analyzer";
 
     let binaryName: string | undefined = undefined;
     if (process.arch === "x64" || process.arch === "x32") {
@@ -211,21 +211,21 @@ async function getServer(config: Config, state: PersistentState): Promise<string
         await state.updateServerVersion(undefined);
     }
 
-    if (state.serverVersion === config.packageJsonVersion) return dest;
+    if (state.serverVersion === config.package.version) return dest;
 
     if (config.askBeforeDownload) {
         const userResponse = await vscode.window.showInformationMessage(
-            `Language server version ${config.packageJsonVersion} for rust-analyzer is not installed.`,
+            `Language server version ${config.package.version} for rust-analyzer is not installed.`,
             "Download now"
         );
         if (userResponse !== "Download now") return dest;
     }
 
-    const release = await fetchRelease(config.releaseTag);
+    const release = await fetchRelease(config.package.releaseTag);
     const artifact = release.assets.find(artifact => artifact.name === binaryName);
     assert(!!artifact, `Bad release: ${JSON.stringify(release)}`);
 
     await download(artifact.browser_download_url, dest, "Downloading rust-analyzer server", { mode: 0o755 });
-    await state.updateServerVersion(config.packageJsonVersion);
+    await state.updateServerVersion(config.package.version);
     return dest;
 }