diff --git a/flow/global-api.js b/flow/global-api.js
index 0b2efb23ac3..eab244c22bb 100644
--- a/flow/global-api.js
+++ b/flow/global-api.js
@@ -8,8 +8,8 @@ declare interface GlobalAPI {
   set: <T>(target: Object | Array<T>, key: string | number, value: T) => T;
   delete: <T>(target: Object| Array<T>, key: string | number) => void;
   nextTick: (fn: Function, context?: Object) => void | Promise<*>;
-  use: (plugin: Function | Object) => void;
-  mixin: (mixin: Object) => void;
+  use: (plugin: Function | Object) => GlobalAPI;
+  mixin: (mixin: Object) => GlobalAPI;
   compile: (template: string) => { render: Function, staticRenderFns: Array<Function> };
 
   directive: (id: string, def?: Function | Object) => Function | Object | void;
diff --git a/test/unit/features/global-api/mixin.spec.js b/test/unit/features/global-api/mixin.spec.js
index bcf962402c2..0b83773a5d4 100644
--- a/test/unit/features/global-api/mixin.spec.js
+++ b/test/unit/features/global-api/mixin.spec.js
@@ -162,4 +162,9 @@ describe('Global API: mixin', () => {
     expect(base).toHaveBeenCalled()
     expect(injected).toHaveBeenCalled()
   })
+
+  // #8595
+  it('chain call', () => {
+    expect(Vue.mixin({})).toBe(Vue)
+  })
 })
diff --git a/test/unit/features/global-api/use.spec.js b/test/unit/features/global-api/use.spec.js
index 00053f808a7..d54ff0750f3 100644
--- a/test/unit/features/global-api/use.spec.js
+++ b/test/unit/features/global-api/use.spec.js
@@ -49,4 +49,9 @@ describe('Global API: use', () => {
     expect(Vue.options.directives['plugin-test']).toBeUndefined()
     expect(Ctor2.options.directives['plugin-test']).toBe(def)
   })
+
+  // #8595
+  it('chain call', () => {
+    expect(Vue.use(() => {})).toBe(Vue)
+  })
 })
diff --git a/types/test/vue-test.ts b/types/test/vue-test.ts
index 031a909b67a..b03b227ffab 100644
--- a/types/test/vue-test.ts
+++ b/types/test/vue-test.ts
@@ -96,6 +96,15 @@ class Test extends Vue {
     this.use;
     this.mixin(Test);
     this.compile("<div>{{ message }}</div>");
+    this
+      .use(() => {
+        
+      })
+      .use(() => {
+        
+      })
+      .mixin({})
+      .mixin({});
   }
 }
 
diff --git a/types/vue.d.ts b/types/vue.d.ts
index e1431453dd9..5a821ecd962 100644
--- a/types/vue.d.ts
+++ b/types/vue.d.ts
@@ -98,9 +98,9 @@ export interface VueConstructor<V extends Vue = Vue> {
   component<Data, Methods, Computed, Props>(id: string, definition?: ThisTypedComponentOptionsWithRecordProps<V, Data, Methods, Computed, Props>): ExtendedVue<V, Data, Methods, Computed, Props>;
   component(id: string, definition?: ComponentOptions<V>): ExtendedVue<V, {}, {}, {}, {}>;
 
-  use<T>(plugin: PluginObject<T> | PluginFunction<T>, options?: T): void;
-  use(plugin: PluginObject<any> | PluginFunction<any>, ...options: any[]): void;
-  mixin(mixin: VueConstructor | ComponentOptions<Vue>): void;
+  use<T>(plugin: PluginObject<T> | PluginFunction<T>, options?: T): this;
+  use(plugin: PluginObject<any> | PluginFunction<any>, ...options: any[]): this;
+  mixin(mixin: VueConstructor | ComponentOptions<Vue>): this;
   compile(template: string): {
     render(createElement: typeof Vue.prototype.$createElement): VNode;
     staticRenderFns: (() => VNode)[];