diff --git a/lib/manager/npm/__fixtures__/inputs/workspaces-simple.json b/lib/manager/npm/__fixtures__/inputs/workspaces-simple.json
new file mode 100644
index 0000000000000000000000000000000000000000..919fe6cd3d93f4194eacfb41349cb07df4b167b4
--- /dev/null
+++ b/lib/manager/npm/__fixtures__/inputs/workspaces-simple.json
@@ -0,0 +1,8 @@
+{
+  "name": "@a/b",
+  "version": "0.0.8",
+  "private": true,
+  "workspaces": ["packages/*"],
+  "license": "MIT",
+  "dependencies": {}
+}
diff --git a/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap b/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap
index c5badfa613f2312584b00cf4af4572d653a3d3e4..cc6a89d49aacda58bc92b039186e9a2faefe5d0d 100644
--- a/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap
+++ b/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap
@@ -865,6 +865,28 @@ Object {
 }
 `;
 
+exports[`manager/npm/extract .extractPackageFile() finds simple yarn workspaces 1`] = `
+Object {
+  "deps": Array [],
+  "ignoreNpmrcFile": undefined,
+  "lernaClient": "npm",
+  "lernaDir": ".",
+  "lernaPackages": undefined,
+  "npmLock": undefined,
+  "npmrc": undefined,
+  "packageJsonName": "@a/b",
+  "packageJsonType": "app",
+  "packageJsonVersion": "0.0.8",
+  "pnpmShrinkwrap": undefined,
+  "skipInstalls": true,
+  "yarnLock": undefined,
+  "yarnWorkspacesPackages": Array [
+    "packages/*",
+  ],
+  "yarnrc": undefined,
+}
+`;
+
 exports[`manager/npm/extract .extractPackageFile() returns an array of dependencies 1`] = `
 Object {
   "deps": Array [
diff --git a/lib/manager/npm/extract/common.ts b/lib/manager/npm/extract/common.ts
index e7300c1d403f2f12b2f388dad6833d5d11091013..b271b010a7695688884f5b278220c13a19805e83 100644
--- a/lib/manager/npm/extract/common.ts
+++ b/lib/manager/npm/extract/common.ts
@@ -1,9 +1,10 @@
 // eslint-disable-next-line import/no-unresolved
 import { PackageJson } from 'type-fest';
 
+export type NpmPackageDependeny = PackageJson.Dependency;
+
 export interface NpmPackage extends PackageJson {
-  workspaces?: any;
-  renovate?: any;
+  renovate?: unknown;
   _from?: any;
   _args?: any;
   _id?: any;
diff --git a/lib/manager/npm/extract/index.spec.ts b/lib/manager/npm/extract/index.spec.ts
index 55fefce35749d3aab05ede1e06a772c61d45222e..9c7648444deb30ee12f01da8a7d43fa343f76b8e 100644
--- a/lib/manager/npm/extract/index.spec.ts
+++ b/lib/manager/npm/extract/index.spec.ts
@@ -2,13 +2,13 @@ import fs from 'fs';
 import path from 'path';
 import * as npmExtract from '.';
 import { getConfig } from '../../../config/defaults';
-import { platform as _platform } from '../../../platform';
+import { platform as _platform } from '../../../../test/util';
 
 // TODO: fix types
-const defaultConfig = getConfig() as any;
+const defaultConfig = getConfig();
 const platform: any = _platform;
 
-function readFixture(fixture) {
+function readFixture(fixture: string) {
   return fs.readFileSync(
     path.resolve(__dirname, `../__fixtures__/${fixture}`),
     'utf8'
@@ -17,6 +17,7 @@ function readFixture(fixture) {
 
 const input01Content = readFixture('inputs/01.json');
 const workspacesContent = readFixture('inputs/workspaces.json');
+const workspacesSimpleContent = readFixture('inputs/workspaces-simple.json');
 const vendorisedContent = readFixture('is-object.json');
 const invalidNameContent = readFixture('invalid-name.json');
 
@@ -167,6 +168,20 @@ describe('manager/npm/extract', () => {
       );
       expect(res).toMatchSnapshot();
     });
+    it('finds simple yarn workspaces', async () => {
+      platform.getFile = jest.fn(fileName => {
+        if (fileName === 'lerna.json') {
+          return '{}';
+        }
+        return null;
+      });
+      const res = await npmExtract.extractPackageFile(
+        workspacesSimpleContent,
+        'package.json',
+        defaultConfig
+      );
+      expect(res).toMatchSnapshot();
+    });
     it('finds complex yarn workspaces', async () => {
       platform.getFile = jest.fn(fileName => {
         if (fileName === 'lerna.json') {
diff --git a/lib/manager/npm/extract/index.ts b/lib/manager/npm/extract/index.ts
index 1bda89750e65c1d007f807d93693a583aa9fb1df..6a239084dd503eebc26b5f8b076e9b6009ebe3aa 100644
--- a/lib/manager/npm/extract/index.ts
+++ b/lib/manager/npm/extract/index.ts
@@ -2,6 +2,7 @@ import { remove } from 'fs-extra';
 import { dirname } from 'path';
 import { join } from 'upath';
 import validateNpmPackageName from 'validate-npm-package-name';
+import is from '@sindresorhus/is';
 import { logger } from '../../../logger';
 
 import { getLockedVersions } from './locked-versions';
@@ -14,7 +15,7 @@ import {
   PackageDependency,
   NpmLockFiles,
 } from '../../common';
-import { NpmPackage } from './common';
+import { NpmPackage, NpmPackageDependeny } from './common';
 import { platform } from '../../../platform';
 import { CONFIG_VALIDATION } from '../../../constants/error-messages';
 import * as nodeVersioning from '../../../versioning/node';
@@ -53,11 +54,11 @@ export async function extractPackageFile(
     `npm file ${fileName} has name ${JSON.stringify(packageJsonName)}`
   );
   const packageJsonVersion = packageJson.version;
-  let yarnWorkspacesPackages;
-  if (packageJson.workspaces && packageJson.workspaces.packages) {
-    yarnWorkspacesPackages = packageJson.workspaces.packages;
-  } else {
+  let yarnWorkspacesPackages: string[];
+  if (is.array(packageJson.workspaces)) {
     yarnWorkspacesPackages = packageJson.workspaces;
+  } else {
+    yarnWorkspacesPackages = packageJson.workspaces?.packages;
   }
   const packageJsonType = mightBeABrowserLibrary(packageJson)
     ? 'library'
@@ -113,7 +114,7 @@ export async function extractPackageFile(
   let lernaPackages: string[];
   let lernaClient: 'yarn' | 'npm';
   let hasFileRefs = false;
-  let lernaJson;
+  let lernaJson: { packages: string[]; npmClient: string };
   try {
     lernaJson = JSON.parse(
       await platform.getFile(join(dirname(fileName), 'lerna.json'))
@@ -272,7 +273,7 @@ export async function extractPackageFile(
     if (packageJson[depType]) {
       try {
         for (const [depName, val] of Object.entries(
-          packageJson[depType] as Record<string, any>
+          packageJson[depType] as NpmPackageDependeny
         )) {
           const dep: PackageDependency = {
             depType,
diff --git a/lib/manager/npm/update.spec.ts b/lib/manager/npm/update.spec.ts
index 69febbf05e440cfa0f06023ed0dd01aad5c94866..ed94b554a521dd6344ad74a15e852eb08d8fb730 100644
--- a/lib/manager/npm/update.spec.ts
+++ b/lib/manager/npm/update.spec.ts
@@ -2,7 +2,7 @@ import fs from 'fs';
 import path from 'path';
 import * as npmUpdater from './update';
 
-function readFixture(fixture) {
+function readFixture(fixture: string) {
   return fs.readFileSync(
     path.resolve(__dirname, `./__fixtures__/${fixture}`),
     'utf8'
diff --git a/lib/manager/npm/update.ts b/lib/manager/npm/update.ts
index 10fac73e1b18ef58f4f7dac19a392320225bfee3..04150ffe55de4986aecc51ef98e4cd51ec454055 100644
--- a/lib/manager/npm/update.ts
+++ b/lib/manager/npm/update.ts
@@ -16,7 +16,7 @@ export function bumpPackageVersion(
     { bumpVersion, currentValue },
     'Checking if we should bump package.json version'
   );
-  let newPjVersion;
+  let newPjVersion: string;
   try {
     if (bumpVersion.startsWith('mirror:')) {
       const mirrorPackage = bumpVersion.replace('mirror:', '');
@@ -131,7 +131,7 @@ export function updateDependency({
       return fileContent;
     }
     if (parsedContents && parsedContents.resolutions) {
-      let depKey;
+      let depKey: string;
       if (parsedContents.resolutions[depName]) {
         depKey = depName;
       } else if (parsedContents.resolutions[`**/${depName}`]) {