diff --git a/appengine/storage.js b/appengine/storage.js
index 4f8a78e8..87d9cae7 100644
--- a/appengine/storage.js
+++ b/appengine/storage.js
@@ -43,7 +43,7 @@ BlocklyStorage.backupBlocks_ = function(workspace) {
 
 /**
  * Bind the localStorage backup function to the unload event.
- * @param {Blockly.WorkspaceSvg} opt_workspace Workspace.
+ * @param {Blockly.WorkspaceSvg=} opt_workspace Workspace.
  */
 BlocklyStorage.backupOnUnload = function(opt_workspace) {
   var workspace = opt_workspace || Blockly.getMainWorkspace();
@@ -53,7 +53,7 @@ BlocklyStorage.backupOnUnload = function(opt_workspace) {
 
 /**
  * Restore code blocks from localStorage.
- * @param {Blockly.WorkspaceSvg} opt_workspace Workspace.
+ * @param {Blockly.WorkspaceSvg=} opt_workspace Workspace.
  */
 BlocklyStorage.restoreBlocks = function(opt_workspace) {
   var url = window.location.href.split('#')[0];
@@ -66,7 +66,7 @@ BlocklyStorage.restoreBlocks = function(opt_workspace) {
 
 /**
  * Save blocks to database and return a link containing key to XML.
- * @param {Blockly.WorkspaceSvg} opt_workspace Workspace.
+ * @param {Blockly.WorkspaceSvg=} opt_workspace Workspace.
  */
 BlocklyStorage.link = function(opt_workspace) {
   var workspace = opt_workspace || Blockly.getMainWorkspace();
@@ -78,7 +78,7 @@ BlocklyStorage.link = function(opt_workspace) {
 /**
  * Retrieve XML text from database using given key.
  * @param {string} key Key to XML, obtained from href.
- * @param {Blockly.WorkspaceSvg} opt_workspace Workspace.
+ * @param {Blockly.WorkspaceSvg=} opt_workspace Workspace.
  */
 BlocklyStorage.retrieveXml = function(key, opt_workspace) {
   var workspace = opt_workspace || Blockly.getMainWorkspace();
@@ -87,7 +87,7 @@ BlocklyStorage.retrieveXml = function(key, opt_workspace) {
 
 /**
  * Global reference to current AJAX request.
- * @type XMLHttpRequest
+ * @type {XMLHttpRequest}
  * @private
  */
 BlocklyStorage.httpRequest_ = null;
diff --git a/core/block.js b/core/block.js
index e3bf2cb3..bcbd0d23 100644
--- a/core/block.js
+++ b/core/block.js
@@ -90,38 +90,45 @@ Blockly.Block.prototype.initialize = function(workspace, prototypeName) {
  * @param {string} prototypeName The typename of the block.
  */
 Blockly.Block.prototype.fill = function(workspace, prototypeName) {
-  /** @type {?Blockly.Connection} */
+  /** @type {Blockly.Connection} */
   this.outputConnection = null;
-  /** @type {?Blockly.Connection} */
+  /** @type {Blockly.Connection} */
   this.nextConnection = null;
-  /** @type {?Blockly.Connection} */
+  /** @type {Blockly.Connection} */
   this.previousConnection = null;
-  /** @type {Blockly.Input[]} */
+  /** @type {!Array.<!Blockly.Input>} */
   this.inputList = [];
-  /** @type {?boolean} */
+  /** @type {boolean|undefined} */
   this.inputsInline = undefined;
   /** @type {boolean} */
   this.rendered = false;
   /** @type {boolean} */
   this.disabled = false;
-  /** @type {(string|Function|object)} */
+  /** @type {string|!Function} */
   this.tooltip = '';
   /** @type {boolean} */
   this.contextMenu = true;
 
+  /** @type {Blockly.Block} */
   this.parentBlock_ = null;
+  /** @type {!Array.<!Blockly.Block>} */
   this.childBlocks_ = [];
+  /** @type {boolean} */
   this.deletable_ = true;
+  /** @type {boolean} */
   this.movable_ = true;
+  /** @type {boolean} */
   this.editable_ = true;
+  /** @type {boolean} */
   this.collapsed_ = false;
 
-  /** @type {?(string|Blockly.Comment)} */
+  /** @type {string|Blockly.Comment} */
   this.comment = null;
 
+  /** @type {!goog.math.Coordinate} */
   this.xy_ = new goog.math.Coordinate(0, 0);
 
-  /** @type {Blockly.Workspace} */
+  /** @type {!Blockly.Workspace} */
   this.workspace = workspace;
   /** @type {boolean} */
   this.isInFlyout = workspace.isFlyout;
@@ -130,7 +137,7 @@ Blockly.Block.prototype.fill = function(workspace, prototypeName) {
 
   // Copy the type-specific functions and data from the prototype.
   if (prototypeName) {
-    /** @type {?string} */
+    /** @type {string} */
     this.type = prototypeName;
     var prototype = Blockly.Blocks[prototypeName];
     goog.asserts.assertObject(prototype,
@@ -142,6 +149,7 @@ Blockly.Block.prototype.fill = function(workspace, prototypeName) {
     this.init();
   }
   // Record initial inline state.
+  /** @type {boolean|undefined} */
   this.inputsInlineDefault = this.inputsInline;
 };
 
@@ -165,7 +173,7 @@ Blockly.Block.getById = function(id, workspace) {
  *     the next statement with the previous statement.  Otherwise, dispose of
  *     all children of this block.
  * @param {boolean} animate If true, show a disposal animation and sound.
- * @param {boolean} opt_dontRemoveFromWorkspace If true, don't remove this
+ * @param {boolean=} opt_dontRemoveFromWorkspace If true, don't remove this
  *     block from the workspace's list of top blocks.
  */
 Blockly.Block.prototype.dispose = function(healStack, animate,
@@ -667,8 +675,8 @@ Blockly.Block.prototype.setTitleValue = function(newValue, name) {
 /**
  * Set whether this block can chain onto the bottom of another block.
  * @param {boolean} newBoolean True if there can be a previous statement.
- * @param {string|Array.<string>|null} opt_check Statement type or list of
- *     statement types.  Null or undefined if any type could be connected.
+ * @param {string|Array.<string>|null|undefined} opt_check Statement type or
+ *     list of statement types.  Null/undefined if any type could be connected.
  */
 Blockly.Block.prototype.setPreviousStatement = function(newBoolean, opt_check) {
   if (this.previousConnection) {
@@ -696,8 +704,8 @@ Blockly.Block.prototype.setPreviousStatement = function(newBoolean, opt_check) {
 /**
  * Set whether another block can chain onto the bottom of this block.
  * @param {boolean} newBoolean True if there can be a next statement.
- * @param {string|Array.<string>|null} opt_check Statement type or list of
- *     statement types.  Null or undefined if any type could be connected.
+ * @param {string|Array.<string>|null|undefined} opt_check Statement type or
+ *     list of statement types.  Null/undefined if any type could be connected.
  */
 Blockly.Block.prototype.setNextStatement = function(newBoolean, opt_check) {
   if (this.nextConnection) {
@@ -723,8 +731,8 @@ Blockly.Block.prototype.setNextStatement = function(newBoolean, opt_check) {
 /**
  * Set whether this block returns a value.
  * @param {boolean} newBoolean True if there is an output.
- * @param {string|Array.<string>|null} opt_check Returned type or list of
- *     returned types.  Null or undefined if any type could be returned
+ * @param {string|Array.<string>|null|undefined} opt_check Returned type or list
+ *     of returned types.  Null or undefined if any type could be returned
  *     (e.g. variable get).
  */
 Blockly.Block.prototype.setOutput = function(newBoolean, opt_check) {
@@ -848,7 +856,7 @@ Blockly.Block.prototype.setCollapsed = function(collapsed) {
 
 /**
  * Create a human-readable text representation of this block and any children.
- * @param {?number} opt_maxLength Truncate the string to this length.
+ * @param {number=} opt_maxLength Truncate the string to this length.
  * @return {string} Text of block.
  */
 Blockly.Block.prototype.toString = function(opt_maxLength) {
@@ -901,7 +909,7 @@ Blockly.Block.prototype.appendStatementInput = function(name) {
 
 /**
  * Shortcut for appending a dummy input row.
- * @param {string} opt_name Language-neutral identifier which may used to find
+ * @param {string=} opt_name Language-neutral identifier which may used to find
  *     this input again.  Should be unique to this block.
  * @return {!Blockly.Input} The input object created.
  */
@@ -1171,7 +1179,7 @@ Blockly.Block.prototype.moveNumberedInputBefore = function(
 /**
  * Remove an input from this block.
  * @param {string} name The name of the input.
- * @param {boolean} opt_quiet True to prevent error if input is not present.
+ * @param {boolean=} opt_quiet True to prevent error if input is not present.
  * @throws {goog.asserts.AssertionError} if the input is not present and
  *     opt_quiet is not true.
  */
diff --git a/core/block_svg.js b/core/block_svg.js
index 67754dc0..38adfd47 100644
--- a/core/block_svg.js
+++ b/core/block_svg.js
@@ -981,7 +981,7 @@ Blockly.BlockSvg.INNER_BOTTOM_LEFT_CORNER_HIGHLIGHT_LTR =
  *     the next statement with the previous statement.  Otherwise, dispose of
  *     all children of this block.
  * @param {boolean} animate If true, show a disposal animation and sound.
- * @param {boolean} opt_dontRemoveFromWorkspace If true, don't remove this
+ * @param {boolean=} opt_dontRemoveFromWorkspace If true, don't remove this
  *     block from the workspace's list of top blocks.
  */
 Blockly.BlockSvg.prototype.dispose = function(healStack, animate,
@@ -1319,7 +1319,7 @@ Blockly.BlockSvg.prototype.removeDragging = function() {
 /**
  * Render the block.
  * Lays out and reflows a block based on its contents and settings.
- * @param {boolean} opt_bubble If false, just render this block.
+ * @param {boolean=} opt_bubble If false, just render this block.
  *   If true, also render block's parent, grandparent, etc.  Defaults to true.
  */
 Blockly.BlockSvg.prototype.render = function(opt_bubble) {
diff --git a/core/css.js b/core/css.js
index ad044940..197f6c86 100644
--- a/core/css.js
+++ b/core/css.js
@@ -41,21 +41,21 @@ Blockly.Css.Cursor = {
 
 /**
  * Current cursor (cached value).
- * @type string
+ * @type {string}
  * @private
  */
 Blockly.Css.currentCursor_ = '';
 
 /**
  * Large stylesheet added by Blockly.Css.inject.
- * @type Element
+ * @type {Element}
  * @private
  */
 Blockly.Css.styleSheet_ = null;
 
 /**
  * Path to media directory, with any trailing slash removed.
- * @type string
+ * @type {string}
  * @private
  */
 Blockly.Css.mediaPath_ = '';
diff --git a/core/field_angle.js b/core/field_angle.js
index ba2d3a02..a8369f56 100644
--- a/core/field_angle.js
+++ b/core/field_angle.js
@@ -34,7 +34,7 @@ goog.require('goog.userAgent');
 /**
  * Class for an editable angle field.
  * @param {string} text The initial content of the field.
- * @param {Function} opt_changeHandler An optional function that is called
+ * @param {Function=} opt_changeHandler An optional function that is called
  *     to validate any constraints on what the user entered.  Takes the new
  *     text as an argument and returns the accepted text or null to abort
  *     the change.
diff --git a/core/field_checkbox.js b/core/field_checkbox.js
index 203c718a..a1c15d39 100644
--- a/core/field_checkbox.js
+++ b/core/field_checkbox.js
@@ -32,7 +32,7 @@ goog.require('Blockly.Field');
 /**
  * Class for a checkbox field.
  * @param {string} state The initial state of the field ('TRUE' or 'FALSE').
- * @param {Function} opt_changeHandler A function that is executed when a new
+ * @param {Function=} opt_changeHandler A function that is executed when a new
  *     option is selected.  Its sole argument is the new checkbox state.  If
  *     it returns a value, this becomes the new checkbox state, unless the
  *     value is null, in which case the change is aborted.
diff --git a/core/field_colour.js b/core/field_colour.js
index 7febac56..69781a92 100644
--- a/core/field_colour.js
+++ b/core/field_colour.js
@@ -36,7 +36,7 @@ goog.require('goog.ui.ColorPicker');
 /**
  * Class for a colour input field.
  * @param {string} colour The initial colour in '#rrggbb' format.
- * @param {Function} opt_changeHandler A function that is executed when a new
+ * @param {Function=} opt_changeHandler A function that is executed when a new
  *     colour is selected.  Its sole argument is the new colour value.  Its
  *     return value becomes the selected colour, unless it is undefined, in
  *     which case the new colour stands, or it is null, in which case the change
diff --git a/core/field_date.js b/core/field_date.js
index e1bc63bb..ffbdf143 100644
--- a/core/field_date.js
+++ b/core/field_date.js
@@ -39,7 +39,7 @@ goog.require('goog.ui.DatePicker');
 /**
  * Class for a date input field.
  * @param {string} date The initial date.
- * @param {Function} opt_changeHandler A function that is executed when a new
+ * @param {Function=} opt_changeHandler A function that is executed when a new
  *     date is selected.  Its sole argument is the new date value.  Its
  *     return value becomes the selected date, unless it is undefined, in
  *     which case the new date stands, or it is null, in which case the change
diff --git a/core/field_dropdown.js b/core/field_dropdown.js
index c275bf64..a614e944 100644
--- a/core/field_dropdown.js
+++ b/core/field_dropdown.js
@@ -41,7 +41,7 @@ goog.require('goog.userAgent');
  * Class for an editable dropdown field.
  * @param {(!Array.<!Array.<string>>|!Function)} menuGenerator An array of options
  *     for a dropdown list, or a function which generates these options.
- * @param {Function} opt_changeHandler A function that is executed when a new
+ * @param {Function=} opt_changeHandler A function that is executed when a new
  *     option is selected, with the newly selected value as its sole argument.
  *     If it returns a value, that value (which must be one of the options) will
  *     become selected in place of the newly selected option, unless the return
diff --git a/core/field_image.js b/core/field_image.js
index 0d569968..6e23bb54 100644
--- a/core/field_image.js
+++ b/core/field_image.js
@@ -36,7 +36,7 @@ goog.require('goog.userAgent');
  * @param {string} src The URL of the image.
  * @param {number} width Width of the image.
  * @param {number} height Height of the image.
- * @param {?string} opt_alt Optional alt text for when block is collapsed.
+ * @param {string=} opt_alt Optional alt text for when block is collapsed.
  * @extends {Blockly.Field}
  * @constructor
  */
diff --git a/core/field_textinput.js b/core/field_textinput.js
index 8e17740a..858e4bca 100644
--- a/core/field_textinput.js
+++ b/core/field_textinput.js
@@ -36,7 +36,7 @@ goog.require('goog.userAgent');
 /**
  * Class for an editable text field.
  * @param {string} text The initial content of the field.
- * @param {Function} opt_changeHandler An optional function that is called
+ * @param {Function=} opt_changeHandler An optional function that is called
  *     to validate any constraints on what the user entered.  Takes the new
  *     text as an argument and returns either the accepted text, a replacement
  *     text, or null to abort the change.
diff --git a/core/field_variable.js b/core/field_variable.js
index 4507a15c..6d0a0dd1 100644
--- a/core/field_variable.js
+++ b/core/field_variable.js
@@ -36,7 +36,7 @@ goog.require('goog.string');
  * Class for a variable's dropdown field.
  * @param {?string} varname The default name for the variable.  If null,
  *     a unique variable name will be generated.
- * @param {Function} opt_changeHandler A function that is executed when a new
+ * @param {Function=} opt_changeHandler A function that is executed when a new
  *     option is selected.  Its sole argument is the new option value.
  * @extends {Blockly.FieldDropdown}
  * @constructor
diff --git a/core/generator.js b/core/generator.js
index d274e286..16cbe62c 100644
--- a/core/generator.js
+++ b/core/generator.js
@@ -51,7 +51,7 @@ Blockly.Generator.NAME_TYPE = 'generated_function';
  * Arbitrary code to inject into locations that risk causing infinite loops.
  * Any instances of '%1' will be replaced by the block ID that failed.
  * E.g. '  checkTimeout(%1);\n'
- * @type ?string
+ * @type {?string}
  */
 Blockly.Generator.prototype.INFINITE_LOOP_TRAP = null;
 
@@ -59,7 +59,7 @@ Blockly.Generator.prototype.INFINITE_LOOP_TRAP = null;
  * Arbitrary code to inject before every statement.
  * Any instances of '%1' will be replaced by the block ID of the statement.
  * E.g. 'highlight(%1);\n'
- * @type ?string
+ * @type {?string}
  */
 Blockly.Generator.prototype.STATEMENT_PREFIX = null;
 
diff --git a/core/inject.js b/core/inject.js
index e2e3aa7d..1d4ad242 100644
--- a/core/inject.js
+++ b/core/inject.js
@@ -36,7 +36,7 @@ goog.require('goog.userAgent');
 /**
  * Inject a Blockly editor into the specified container element (usually a div).
  * @param {!Element|string} container Containing element or its ID.
- * @param {Object} opt_options Optional dictionary of options.
+ * @param {Object=} opt_options Optional dictionary of options.
  * @return {!Blockly.Workspace} Newly created main workspace.
  */
 Blockly.inject = function(container, opt_options) {
diff --git a/core/input.js b/core/input.js
index f7f96205..044782a1 100644
--- a/core/input.js
+++ b/core/input.js
@@ -61,7 +61,7 @@ Blockly.Input = function(type, name, block, connection) {
 /**
  * Add an item to the end of the input's field row.
  * @param {string|!Blockly.Field} field Something to add as a field.
- * @param {string} opt_name Language-neutral identifier which may used to find
+ * @param {string=} opt_name Language-neutral identifier which may used to find
  *     this field again.  Should be unique to the host block.
  * @return {!Blockly.Input} The input being append to (to allow chaining).
  */
@@ -101,7 +101,7 @@ Blockly.Input.prototype.appendField = function(field, opt_name) {
 /**
  * Add an item to the end of the input's field row.
  * @param {*} field Something to add as a field.
- * @param {string} opt_name Language-neutral identifier which may used to find
+ * @param {string=} opt_name Language-neutral identifier which may used to find
  *     this field again.  Should be unique to the host block.
  * @return {!Blockly.Input} The input being append to (to allow chaining).
  * @deprecated December 2013
diff --git a/core/msg.js b/core/msg.js
index f5768c0c..9056885f 100644
--- a/core/msg.js
+++ b/core/msg.js
@@ -32,7 +32,7 @@ goog.provide('Blockly.Msg');
 
 /**
  * Back up original getMsg function.
- * @type !Function
+ * @type {!Function}
  */
 goog.getMsgOrig = goog.getMsg;
 
diff --git a/core/procedures.js b/core/procedures.js
index 01e2d8c0..d190f066 100644
--- a/core/procedures.js
+++ b/core/procedures.js
@@ -117,7 +117,7 @@ Blockly.Procedures.findLegalName = function(name, block) {
  * procedures already defined.
  * @param {string} name The questionable name.
  * @param {!Blockly.Workspace} workspace The workspace to scan for collisions.
- * @param {Blockly.Block} opt_exclude Optional block to exclude from
+ * @param {Blockly.Block=} opt_exclude Optional block to exclude from
  *     comparisons (one doesn't want to collide with oneself).
  * @return {boolean} True if the name is legal.
  */
diff --git a/core/scrollbar.js b/core/scrollbar.js
index 4e107bb6..bf2dd808 100644
--- a/core/scrollbar.js
+++ b/core/scrollbar.js
@@ -144,7 +144,7 @@ Blockly.ScrollbarPair.prototype.set = function(x, y) {
  * look or behave like the system's scrollbars.
  * @param {!Blockly.Workspace} workspace Workspace to bind the scrollbar to.
  * @param {boolean} horizontal True if horizontal, false if vertical.
- * @param {boolean} opt_pair True if the scrollbar is part of a horiz/vert pair.
+ * @param {boolean=} opt_pair True if the scrollbar is part of a horiz/vert pair.
  * @constructor
  */
 Blockly.Scrollbar = function(workspace, horizontal, opt_pair) {
diff --git a/core/tooltip.js b/core/tooltip.js
index ef8dd8d4..af33d4a1 100644
--- a/core/tooltip.js
+++ b/core/tooltip.js
@@ -108,7 +108,7 @@ Blockly.Tooltip.MARGINS = 5;
 
 /**
  * The HTML container.  Set once by Blockly.Tooltip.createDom.
- * @type Element
+ * @type {Element}
  */
 Blockly.Tooltip.DIV = null;
 
diff --git a/core/utils.js b/core/utils.js
index 77e1d30f..dd32d0fb 100644
--- a/core/utils.js
+++ b/core/utils.js
@@ -395,7 +395,7 @@ Blockly.shortestStringLength = function(array) {
  * Given an array of strings, return the length of the common prefix.
  * Words may not be split.  Any space after a word is included in the length.
  * @param {!Array.<string>} array Array of strings.
- * @param {?number} opt_shortest Length of shortest string.
+ * @param {number=} opt_shortest Length of shortest string.
  * @return {number} Length of common prefix.
  */
 Blockly.commonWordPrefix = function(array, opt_shortest) {
@@ -430,7 +430,7 @@ Blockly.commonWordPrefix = function(array, opt_shortest) {
  * Given an array of strings, return the length of the common suffix.
  * Words may not be split.  Any space after a word is included in the length.
  * @param {!Array.<string>} array Array of strings.
- * @param {?number} opt_shortest Length of shortest string.
+ * @param {number=} opt_shortest Length of shortest string.
  * @return {number} Length of common suffix.
  */
 Blockly.commonWordSuffix = function(array, opt_shortest) {
diff --git a/core/widgetdiv.js b/core/widgetdiv.js
index 75485bf7..ff0b55aa 100644
--- a/core/widgetdiv.js
+++ b/core/widgetdiv.js
@@ -34,21 +34,21 @@ goog.require('goog.dom');
 
 /**
  * The HTML container.  Set once by Blockly.WidgetDiv.createDom.
- * @type Element
+ * @type {Element}
  */
 Blockly.WidgetDiv.DIV = null;
 
 /**
  * The object currently using this container.
  * @private
- * @type Object
+ * @type {Object}
  */
 Blockly.WidgetDiv.owner_ = null;
 
 /**
  * Optional cleanup function set by whichever object uses the widget.
  * @private
- * @type Function
+ * @type {Function}
  */
 Blockly.WidgetDiv.dispose_ = null;
 
diff --git a/core/workspace.js b/core/workspace.js
index b8cc83c3..b7fe0560 100644
--- a/core/workspace.js
+++ b/core/workspace.js
@@ -32,7 +32,7 @@ goog.require('goog.math');
 /**
  * Class for a workspace.  This is a data structure that contains blocks.
  * There is no UI, and can be created headlessly.
- * @param {Object} opt_options Dictionary of options.
+ * @param {Object=} opt_options Dictionary of options.
  * @constructor
  */
 Blockly.Workspace = function(opt_options) {
diff --git a/core/workspace_svg.js b/core/workspace_svg.js
index 0dcdf06b..e1e63fac 100644
--- a/core/workspace_svg.js
+++ b/core/workspace_svg.js
@@ -645,7 +645,7 @@ Blockly.WorkspaceSvg.prototype.preloadAudio_ = function() {
  * Play an audio file at specified value.  If volume is not specified,
  * use full volume (1).
  * @param {string} name Name of sound.
- * @param {?number} opt_volume Volume of sound (0-1).
+ * @param {number=} opt_volume Volume of sound (0-1).
  */
 Blockly.WorkspaceSvg.prototype.playAudio = function(name, opt_volume) {
   var sound = this.SOUNDS_[name];
diff --git a/demos/blockfactory/factory.js b/demos/blockfactory/factory.js
index 3bc0b9f4..ae215cd0 100644
--- a/demos/blockfactory/factory.js
+++ b/demos/blockfactory/factory.js
@@ -25,13 +25,13 @@
 
 /**
  * Workspace for user to build block.
- * @type Blockly.Workspace
+ * @type {Blockly.Workspace}
  */
 var mainWorkspace = null;
 
 /**
  * Workspace for preview of block.
- * @type Blockly.Workspace
+ * @type {Blockly.Workspace}
  */
 var previewWorkspace = null;
 
diff --git a/demos/code/code.js b/demos/code/code.js
index d0727fee..09d24739 100644
--- a/demos/code/code.js
+++ b/demos/code/code.js
@@ -82,7 +82,7 @@ Code.LANGUAGE_RTL = ['ar', 'fa', 'he'];
 
 /**
  * Blockly's main workspace.
- * @type Blockly.WorkspaceSvg
+ * @type {Blockly.WorkspaceSvg}
  */
 Code.workspace = null;
 
@@ -235,7 +235,7 @@ Code.getBBox_ = function(element) {
 
 /**
  * User's language (e.g. "en").
- * @type string
+ * @type {string}
  */
 Code.LANG = Code.getLang();
 
diff --git a/demos/graph/index.html b/demos/graph/index.html
index 7fdf907b..daa318e5 100644
--- a/demos/graph/index.html
+++ b/demos/graph/index.html
@@ -176,20 +176,20 @@ var Graph = {};
 
 /**
  * Main Blockly workspace.
- * @type Blockly.WorkspaceSvg
+ * @type {Blockly.WorkspaceSvg}
  */
 Graph.workspace = null;
 
 /**
  * Cached copy of the function string.
- * @type ?string
+ * @type {?string}
  * @private
  */
 Graph.oldFormula_ = null;
 
 /**
  * Drawing options for the Chart API.
- * @type !Object
+ * @type {!Object}
  * @private
  */
 Graph.options_ = {
diff --git a/demos/plane/plane.js b/demos/plane/plane.js
index bc2cd164..c931c68d 100644
--- a/demos/plane/plane.js
+++ b/demos/plane/plane.js
@@ -76,7 +76,7 @@ Plane.LANGUAGE_RTL = ['ar', 'fa', 'he'];
 
 /**
  * Main Blockly workspace.
- * @type Blockly.WorkspaceSvg
+ * @type {Blockly.WorkspaceSvg}
  */
 Plane.workspace = null;
 
@@ -201,7 +201,7 @@ Plane.getMsg = function(key) {
 
 /**
  * User's language (e.g. "en").
- * @type string
+ * @type {string}
  */
 Plane.LANG = Plane.getLang();
 
diff --git a/demos/plane/slider.js b/demos/plane/slider.js
index 7fa949c2..2df67b83 100644
--- a/demos/plane/slider.js
+++ b/demos/plane/slider.js
@@ -30,7 +30,7 @@
  * @param {number} y The vertical offset of the slider.
  * @param {number} width The total width of the slider.
  * @param {!Element} svgParent The SVG element to append the slider to.
- * @param {Function} opt_changeFunc Optional callback function that will be
+ * @param {Function=} opt_changeFunc Optional callback function that will be
  *     called when the slider is moved.  The current value is passed.
  * @constructor
  */
diff --git a/generators/dart.js b/generators/dart.js
index d660b645..b3c1c255 100644
--- a/generators/dart.js
+++ b/generators/dart.js
@@ -31,7 +31,7 @@ goog.require('Blockly.Generator');
 
 /**
  * Dart code generator.
- * @type !Blockly.Generator
+ * @type {!Blockly.Generator}
  */
 Blockly.Dart = new Blockly.Generator('Dart');
 
diff --git a/generators/javascript.js b/generators/javascript.js
index 79e14256..2652186c 100644
--- a/generators/javascript.js
+++ b/generators/javascript.js
@@ -31,7 +31,7 @@ goog.require('Blockly.Generator');
 
 /**
  * JavaScript code generator.
- * @type !Blockly.Generator
+ * @type {!Blockly.Generator}
  */
 Blockly.JavaScript = new Blockly.Generator('JavaScript');
 
diff --git a/generators/php.js b/generators/php.js
index d40a1e0b..bf83ab9c 100644
--- a/generators/php.js
+++ b/generators/php.js
@@ -31,7 +31,7 @@ goog.require('Blockly.Generator');
 
 /**
  * PHP code generator.
- * @type !Blockly.Generator
+ * @type {!Blockly.Generator}
  */
 Blockly.PHP = new Blockly.Generator('PHP');
 
diff --git a/generators/python.js b/generators/python.js
index a0189690..54b85736 100644
--- a/generators/python.js
+++ b/generators/python.js
@@ -31,7 +31,7 @@ goog.require('Blockly.Generator');
 
 /**
  * Python code generator.
- * @type !Blockly.Generator
+ * @type {!Blockly.Generator}
  */
 Blockly.Python = new Blockly.Generator('Python');