diff --git a/src/lib/blocks.js b/src/lib/blocks.js
index eadf6d6fff6ec22e75f019178aef53e262bf4b9a..b7ecc928a9b8e3d02430b95601b9683ad79b38a1 100644
--- a/src/lib/blocks.js
+++ b/src/lib/blocks.js
@@ -247,6 +247,7 @@ export default function (vm) {
                 }
                 // Get all the stage variables (no lists) so we can add them to menu when the stage is selected.
                 const stageVariableOptions = vm.runtime.getTargetForStage().getAllVariableNamesInScopeByType('');
+                stageVariableOptions.sort(ScratchBlocks.scratchBlocksUtils.compareStrings);
                 const stageVariableMenuItems = stageVariableOptions.map(variable => [variable, variable]);
                 if (sensingOfBlock.inputs.OBJECT.shadow !== sensingOfBlock.inputs.OBJECT.block) {
                     // There's a block dropped on top of the menu. It'd be nice to evaluate it and
@@ -265,6 +266,7 @@ export default function (vm) {
                 // The target should exist, but there are ways for it not to (e.g. #4203).
                 if (target) {
                     spriteVariableOptions = target.getAllVariableNamesInScopeByType('', true);
+                    spriteVariableOptions.sort(ScratchBlocks.scratchBlocksUtils.compareStrings);
                 }
                 const spriteVariableMenuItems = spriteVariableOptions.map(variable => [variable, variable]);
                 return spriteOptions.concat(spriteVariableMenuItems);