diff --git a/lib/datasource/docker/index.ts b/lib/datasource/docker/index.ts
index 5a31e90b2bc44231aa33ac353cec99a855aeabf2..7cc5bc301f6c01a5820f46c40cb02e35dd8d8689 100644
--- a/lib/datasource/docker/index.ts
+++ b/lib/datasource/docker/index.ts
@@ -1,4 +1,3 @@
-import { OutgoingHttpHeaders } from 'http';
 import URL from 'url';
 import { ECR } from '@aws-sdk/client-ecr';
 import hasha from 'hasha';
@@ -11,6 +10,7 @@ import { ExternalHostError } from '../../types/errors/external-host-error';
 import * as packageCache from '../../util/cache/package';
 import * as hostRules from '../../util/host-rules';
 import { Http, HttpResponse } from '../../util/http';
+import type { OutgoingHttpHeaders } from '../../util/http/types';
 import { ensureTrailingSlash, trimTrailingSlash } from '../../util/url';
 import * as dockerVersioning from '../../versioning/docker';
 import type { GetReleasesConfig, ReleaseResult } from '../types';
diff --git a/lib/datasource/gradle-version/index.ts b/lib/datasource/gradle-version/index.ts
index b9a0a29ca675633817be66eee1df9f87850a7fdb..6638ea55b5f01f179a0f8ab3f9cd7f43dded21e8 100644
--- a/lib/datasource/gradle-version/index.ts
+++ b/lib/datasource/gradle-version/index.ts
@@ -1,5 +1,6 @@
 import { ExternalHostError } from '../../types/errors/external-host-error';
-import { Http, HttpError } from '../../util/http';
+import { Http } from '../../util/http';
+import { HttpError } from '../../util/http/types';
 import { regEx } from '../../util/regex';
 import * as gradleVersioning from '../../versioning/gradle';
 import type { GetReleasesConfig, Release, ReleaseResult } from '../types';
diff --git a/lib/datasource/npm/npmrc.ts b/lib/datasource/npm/npmrc.ts
index c366b8e2a1ead3af8f49b91d9f4ca783f2fe6920..7afc4c89b13e5277aaa463b6b3d034198bcc5f17 100644
--- a/lib/datasource/npm/npmrc.ts
+++ b/lib/datasource/npm/npmrc.ts
@@ -1,4 +1,3 @@
-import { OutgoingHttpHeaders } from 'http';
 import url from 'url';
 import is from '@sindresorhus/is';
 import ini from 'ini';
@@ -6,6 +5,7 @@ import registryAuthToken from 'registry-auth-token';
 import getRegistryUrl from 'registry-auth-token/registry-url';
 import { getAdminConfig } from '../../config/admin';
 import { logger } from '../../logger';
+import type { OutgoingHttpHeaders } from '../../util/http/types';
 import { maskToken } from '../../util/mask';
 import { add } from '../../util/sanitize';
 
diff --git a/lib/datasource/pod/index.ts b/lib/datasource/pod/index.ts
index dd2d050815c175746bb307dc9f460efb0769a418..c231142d9a67070e83e5223adae42f5475ed3f21 100644
--- a/lib/datasource/pod/index.ts
+++ b/lib/datasource/pod/index.ts
@@ -3,8 +3,9 @@ import { HOST_DISABLED } from '../../constants/error-messages';
 import { logger } from '../../logger';
 import { ExternalHostError } from '../../types/errors/external-host-error';
 import * as packageCache from '../../util/cache/package';
-import { Http, HttpError } from '../../util/http';
+import { Http } from '../../util/http';
 import { GithubHttp } from '../../util/http/github';
+import type { HttpError } from '../../util/http/types';
 import type { GetReleasesConfig, ReleaseResult } from '../types';
 
 export const id = 'pod';
diff --git a/lib/datasource/rubygems/get.ts b/lib/datasource/rubygems/get.ts
index 2525bff001279fdadd03c1c047984ffd4d9b6172..71546019caea2e5d763e4689b905f9b6707c47a9 100644
--- a/lib/datasource/rubygems/get.ts
+++ b/lib/datasource/rubygems/get.ts
@@ -1,7 +1,7 @@
-import { OutgoingHttpHeaders } from 'http';
 import urlJoin from 'url-join';
 import { logger } from '../../logger';
 import { Http } from '../../util/http';
+import type { OutgoingHttpHeaders } from '../../util/http/types';
 import type { ReleaseResult } from '../types';
 import { id } from './common';
 
diff --git a/lib/util/http/index.ts b/lib/util/http/index.ts
index a968ab9fbad12fbd3a5a62cc76d77f2f94e9ff9a..fe014f8d426d2da1546e78a64ba7d78216345e6f 100644
--- a/lib/util/http/index.ts
+++ b/lib/util/http/index.ts
@@ -1,4 +1,5 @@
 import crypto from 'crypto';
+import merge from 'deepmerge';
 import got, { Options, Response } from 'got';
 import { HOST_DISABLED } from '../../constants/error-messages';
 import { logger } from '../../logger';
@@ -9,17 +10,11 @@ import { resolveBaseUrl } from '../url';
 import { applyAuthorization, removeAuthorization } from './auth';
 import { applyHostRules } from './host-rules';
 import { getQueue } from './queue';
-import { GotOptions, RequestStats } from './types';
+import type { GotOptions, OutgoingHttpHeaders, RequestStats } from './types';
 
 // TODO: refactor code to remove this
 import './legacy';
 
-export * from './types';
-
-interface OutgoingHttpHeaders {
-  [header: string]: number | string | string[] | undefined;
-}
-
 export interface HttpOptions {
   body?: any;
   username?: string;
@@ -95,13 +90,16 @@ export class Http<GetOptions = HttpOptions, PostOptions = HttpPostOptions> {
     if (httpOptions?.baseUrl) {
       url = resolveBaseUrl(httpOptions.baseUrl, url);
     }
-    // TODO: deep merge in order to merge headers
-    let options: GotOptions = {
-      method: 'get',
-      ...this.options,
-      hostType: this.hostType,
-      ...httpOptions,
-    } as unknown; // TODO: fixme
+
+    let options: GotOptions = merge<GotOptions>(
+      {
+        method: 'get',
+        ...this.options,
+        hostType: this.hostType,
+      },
+      httpOptions
+    );
+
     if (process.env.NODE_ENV === 'test') {
       options.retry = 0;
     }
diff --git a/lib/util/http/types.ts b/lib/util/http/types.ts
index 63a53e4e2a78c2d060ada9d561b902071b89d609..9ec9a273fd8dbaa290b7e69b1b74c823bba26972 100644
--- a/lib/util/http/types.ts
+++ b/lib/util/http/types.ts
@@ -23,3 +23,5 @@ export interface RequestStats {
   duration: number;
   queueDuration: number;
 }
+
+export type OutgoingHttpHeaders = Record<string, string | string[] | undefined>;
diff --git a/lib/workers/repository/stats.ts b/lib/workers/repository/stats.ts
index a319cba082aa7bf0f08877fd08ff4ff78b2eb325..7384796e3efeac8603da72a95b927d0d197fd0ec 100644
--- a/lib/workers/repository/stats.ts
+++ b/lib/workers/repository/stats.ts
@@ -1,7 +1,7 @@
 import URL from 'url';
 import { logger } from '../../logger';
 import * as memCache from '../../util/cache/memory';
-import { RequestStats } from '../../util/http';
+import type { RequestStats } from '../../util/http/types';
 
 export function printRequestStats(): void {
   const httpRequests = memCache.get<RequestStats[]>('http-requests');