diff --git a/src/node/cli.ts b/src/node/cli.ts
index e5d0695519d7..d3afe203d5b8 100644
--- a/src/node/cli.ts
+++ b/src/node/cli.ts
@@ -401,7 +401,10 @@ export async function readConfigFile(configPath?: string): Promise<Args> {
 
 function parseBindAddr(bindAddr: string): [string, number] {
   const u = new URL(`http://${bindAddr}`)
-  return [u.hostname, parseInt(u.port, 10)]
+  // With the http scheme 80 will be dropped so assume it's 80 if missing. This
+  // means --bind-addr <addr> without a port will default to 80 as well and not
+  // the code-server default.
+  return [u.hostname, u.port ? parseInt(u.port, 10) : 80]
 }
 
 interface Addr {
diff --git a/src/node/http.ts b/src/node/http.ts
index a8abb94b0f86..297dda0cce1a 100644
--- a/src/node/http.ts
+++ b/src/node/http.ts
@@ -584,8 +584,11 @@ export class HttpServer {
         const onListen = (): void => resolve(this.address())
         if (this.options.socket) {
           this.server.listen(this.options.socket, onListen)
+        } else if (this.options.host) {
+          // [] is the correct format when using :: but Node errors with them.
+          this.server.listen(this.options.port, this.options.host.replace(/^\[|\]$/g, ""), onListen)
         } else {
-          this.server.listen(this.options.port, this.options.host, onListen)
+          this.server.listen(this.options.port, onListen)
         }
       })
     }