diff --git a/.github/workflows/ruby.yml b/.github/workflows/ruby.yml
index 2012e7f8..2a581710 100644
--- a/.github/workflows/ruby.yml
+++ b/.github/workflows/ruby.yml
@@ -22,27 +22,11 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        ruby: [2.3, 2.4, 2.5, 2.6, 2.7]
-        rails: ["4.1", "4.2", "5.0", "5.2.3", "6.0"]
-        exclude:
-          - ruby: "2.4"
-            rails: "4.1"
-          - ruby: "2.4"
-            rails: "4.2"
-          - ruby: "2.4"
-            rails: "6.0"
-          - ruby: "2.5"
-            rails: "4.1"
-          - ruby: "2.5"
-            rails: "4.2"
-          - ruby: "2.6"
-            rails: "4.1"
-          - ruby: "2.6"
-            rails: "4.2"
-          - ruby: "2.7"
-            rails: "4.1"
-          - ruby: "2.7"
-            rails: "4.2"
+        ruby:
+          - "3.0"
+          - "3.1"
+          - "3.2"
+          - "3.3"
     steps:
     - uses: actions/checkout@v4
     - name: Set up Ruby
@@ -51,4 +35,6 @@ jobs:
         ruby-version: ${{ matrix.ruby }}
         bundler-cache: true # runs 'bundle install' and caches installed gems automatically
     - name: Run tests
-      run: bundle exec rake
+      run: |
+        bundle exec appraisal install
+        bundle exec appraisal rake test
diff --git a/Appraisals b/Appraisals
index 6a74ec34..d945edc6 100644
--- a/Appraisals
+++ b/Appraisals
@@ -1,20 +1,25 @@
-appraise '3.2' do
-  gem 'activesupport', '~> 3.2.22'
-  gem 'minitest', '~> 5'
+appraise 'activesupport-6.0' do
+  gem 'activesupport', '~> 6.0.0'
 end
 
-appraise '4.0' do
-  gem 'activesupport', '~> 4.0.13'
+appraise 'activesupport-6.1' do
+  gem 'activesupport', '~> 6.1.0'
 end
 
-appraise '4.1' do
-  gem 'activesupport', '~> 4.1.14'
+appraise 'activesupport-7.0' do
+  gem 'activesupport', '~> 7.0.0'
 end
 
-appraise '4.2' do
-  gem 'activesupport', '~> 4.2.5.1'
+appraise 'activesupport-7.1' do
+  gem 'activesupport', '~> 7.1.0'
 end
 
-appraise '5.0' do
-  gem 'activesupport', '~> 5.0.0'
+appraise 'faraday-1.x' do
+  gem 'faraday', '~> 1.10'
+  gem 'faraday-gzip', '~> 1.0'
+end
+
+appraise 'faraday-2.x' do
+  gem 'faraday', '~> 2.0'
+  gem 'faraday-gzip', '~> 2.0'
 end
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 800e455e..f11740e2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,7 +2,11 @@
 
 ## Unreleased
 
-
+- [#412](https://github.com/JsonApiClient/json_api_client/pull/412)
+  - Add support for faraday 2.x
+  - Drop support for Ruby < 3.0 (EOL)
+  - Drop support for activesupport < 6.0 (EOL)
+  - Remove deprecated faraday_middleware and add faraday-gzip (from [#402](https://github.com/JsonApiClient/json_api_client/pull/402))
 - [#400](https://github.com/JsonApiClient/json_api_client/pull/400) - Fix for multi-word custom endpoint and route format
 
 ## 1.22.0
diff --git a/Gemfile b/Gemfile
index 0b5a6e5c..c4323770 100644
--- a/Gemfile
+++ b/Gemfile
@@ -3,9 +3,8 @@ source "https://rubygems.org"
 gemspec
 
 gem 'rake'
-gem 'appraisal'
 
-gem "activesupport"
+gem "activesupport", ">= 4.0.13"
 gem 'addressable', '~> 2.2'
 
 gem "codeclimate-test-reporter", group: :test, require: nil
diff --git a/gemfiles/3.2.gemfile b/gemfiles/3.2.gemfile
deleted file mode 100644
index 822daa14..00000000
--- a/gemfiles/3.2.gemfile
+++ /dev/null
@@ -1,16 +0,0 @@
-# This file was generated by Appraisal
-
-source "https://rubygems.org"
-
-gem "rake"
-gem "appraisal"
-gem "activesupport", "~> 3.2.22"
-gem "addressable", "~> 2.2"
-gem "codeclimate-test-reporter", :group => :test, :require => nil
-gem "minitest", "~> 5"
-
-group :development, :test do
-  gem "byebug", :platforms => [:mri_20, :mri_21, :mri_22]
-end
-
-gemspec :path => "../"
diff --git a/gemfiles/4.0.gemfile b/gemfiles/4.0.gemfile
deleted file mode 100644
index 1f6e12a8..00000000
--- a/gemfiles/4.0.gemfile
+++ /dev/null
@@ -1,15 +0,0 @@
-# This file was generated by Appraisal
-
-source "https://rubygems.org"
-
-gem "rake"
-gem "appraisal"
-gem "activesupport", "~> 4.0.13"
-gem "addressable", "~> 2.2"
-gem "codeclimate-test-reporter", :group => :test, :require => nil
-
-group :development, :test do
-  gem "byebug", :platforms => [:mri_20, :mri_21, :mri_22]
-end
-
-gemspec :path => "../"
diff --git a/gemfiles/4.1.gemfile b/gemfiles/4.1.gemfile
deleted file mode 100644
index cf256c7f..00000000
--- a/gemfiles/4.1.gemfile
+++ /dev/null
@@ -1,15 +0,0 @@
-# This file was generated by Appraisal
-
-source "https://rubygems.org"
-
-gem "rake"
-gem "appraisal"
-gem "activesupport", "~> 4.1.14"
-gem "addressable", "~> 2.2"
-gem "codeclimate-test-reporter", :group => :test, :require => nil
-
-group :development, :test do
-  gem "byebug", :platforms => [:mri_20, :mri_21, :mri_22]
-end
-
-gemspec :path => "../"
diff --git a/gemfiles/4.2.gemfile b/gemfiles/4.2.gemfile
deleted file mode 100644
index ec3599cd..00000000
--- a/gemfiles/4.2.gemfile
+++ /dev/null
@@ -1,15 +0,0 @@
-# This file was generated by Appraisal
-
-source "https://rubygems.org"
-
-gem "rake"
-gem "appraisal"
-gem "activesupport", "~> 4.2.5.1"
-gem "addressable", "~> 2.2"
-gem "codeclimate-test-reporter", :group => :test, :require => nil
-
-group :development, :test do
-  gem "byebug", :platforms => [:mri_20, :mri_21, :mri_22]
-end
-
-gemspec :path => "../"
diff --git a/gemfiles/5.0.gemfile b/gemfiles/5.0.gemfile
deleted file mode 100644
index be66dee2..00000000
--- a/gemfiles/5.0.gemfile
+++ /dev/null
@@ -1,15 +0,0 @@
-# This file was generated by Appraisal
-
-source "https://rubygems.org"
-
-gem "rake"
-gem "appraisal"
-gem "activesupport", "~> 5.0.0"
-gem "addressable", "~> 2.2"
-gem "codeclimate-test-reporter", :group => :test, :require => nil
-
-group :development, :test do
-  gem "byebug", :platforms => [:mri_20, :mri_21, :mri_22]
-end
-
-gemspec :path => "../"
diff --git a/gemfiles/5.2.3.gemfile b/gemfiles/5.2.3.gemfile
deleted file mode 100644
index 9a9fda0a..00000000
--- a/gemfiles/5.2.3.gemfile
+++ /dev/null
@@ -1,15 +0,0 @@
-# This file was generated by Appraisal
-
-source "https://rubygems.org"
-
-gem "rake"
-gem "appraisal"
-gem "activesupport", "~> 5.2.3"
-gem "addressable", "~> 2.2"
-gem "codeclimate-test-reporter", :group => :test, :require => nil
-
-group :development, :test do
-  gem "byebug", :platforms => [:mri_20, :mri_21, :mri_22]
-end
-
-gemspec :path => "../"
diff --git a/gemfiles/6.0.gemfile b/gemfiles/activesupport_6.0.gemfile
similarity index 54%
rename from gemfiles/6.0.gemfile
rename to gemfiles/activesupport_6.0.gemfile
index e046e114..57a778e1 100644
--- a/gemfiles/6.0.gemfile
+++ b/gemfiles/activesupport_6.0.gemfile
@@ -3,13 +3,12 @@
 source "https://rubygems.org"
 
 gem "rake"
-gem "appraisal"
 gem "activesupport", "~> 6.0.0"
 gem "addressable", "~> 2.2"
-gem "codeclimate-test-reporter", :group => :test, :require => nil
+gem "codeclimate-test-reporter", group: :test, require: nil
 
 group :development, :test do
-  gem "byebug", :platforms => [:mri_25]
+  gem "byebug", "~> 10.0", platforms: [:mri_20, :mri_21, :mri_22]
 end
 
-gemspec :path => "../"
+gemspec path: "../"
diff --git a/gemfiles/activesupport_6.1.gemfile b/gemfiles/activesupport_6.1.gemfile
new file mode 100644
index 00000000..460b7529
--- /dev/null
+++ b/gemfiles/activesupport_6.1.gemfile
@@ -0,0 +1,14 @@
+# This file was generated by Appraisal
+
+source "https://rubygems.org"
+
+gem "rake"
+gem "activesupport", "~> 6.1.0"
+gem "addressable", "~> 2.2"
+gem "codeclimate-test-reporter", group: :test, require: nil
+
+group :development, :test do
+  gem "byebug", "~> 10.0", platforms: [:mri_20, :mri_21, :mri_22]
+end
+
+gemspec path: "../"
diff --git a/gemfiles/activesupport_7.0.gemfile b/gemfiles/activesupport_7.0.gemfile
new file mode 100644
index 00000000..5d577ad6
--- /dev/null
+++ b/gemfiles/activesupport_7.0.gemfile
@@ -0,0 +1,14 @@
+# This file was generated by Appraisal
+
+source "https://rubygems.org"
+
+gem "rake"
+gem "activesupport", "~> 7.0.0"
+gem "addressable", "~> 2.2"
+gem "codeclimate-test-reporter", group: :test, require: nil
+
+group :development, :test do
+  gem "byebug", "~> 10.0", platforms: [:mri_20, :mri_21, :mri_22]
+end
+
+gemspec path: "../"
diff --git a/gemfiles/activesupport_7.1.gemfile b/gemfiles/activesupport_7.1.gemfile
new file mode 100644
index 00000000..5347aea7
--- /dev/null
+++ b/gemfiles/activesupport_7.1.gemfile
@@ -0,0 +1,14 @@
+# This file was generated by Appraisal
+
+source "https://rubygems.org"
+
+gem "rake"
+gem "activesupport", "~> 7.1.0"
+gem "addressable", "~> 2.2"
+gem "codeclimate-test-reporter", group: :test, require: nil
+
+group :development, :test do
+  gem "byebug", "~> 10.0", platforms: [:mri_20, :mri_21, :mri_22]
+end
+
+gemspec path: "../"
diff --git a/gemfiles/faraday_1.x.gemfile b/gemfiles/faraday_1.x.gemfile
new file mode 100644
index 00000000..f6c65ac0
--- /dev/null
+++ b/gemfiles/faraday_1.x.gemfile
@@ -0,0 +1,16 @@
+# This file was generated by Appraisal
+
+source "https://rubygems.org"
+
+gem "rake"
+gem "activesupport", ">= 4.0.13"
+gem "addressable", "~> 2.2"
+gem "codeclimate-test-reporter", group: :test, require: nil
+gem "faraday", "~> 1.10"
+gem "faraday-gzip", "~> 1.0"
+
+group :development, :test do
+  gem "byebug", "~> 10.0", platforms: [:mri_20, :mri_21, :mri_22]
+end
+
+gemspec path: "../"
diff --git a/gemfiles/faraday_2.x.gemfile b/gemfiles/faraday_2.x.gemfile
new file mode 100644
index 00000000..d857de41
--- /dev/null
+++ b/gemfiles/faraday_2.x.gemfile
@@ -0,0 +1,16 @@
+# This file was generated by Appraisal
+
+source "https://rubygems.org"
+
+gem "rake"
+gem "activesupport", ">= 4.0.13"
+gem "addressable", "~> 2.2"
+gem "codeclimate-test-reporter", group: :test, require: nil
+gem "faraday", "~> 2.0"
+gem "faraday-gzip", "~> 2.0"
+
+group :development, :test do
+  gem "byebug", "~> 10.0", platforms: [:mri_20, :mri_21, :mri_22]
+end
+
+gemspec path: "../"
diff --git a/json_api_client.gemspec b/json_api_client.gemspec
index 658f92f3..3c048320 100644
--- a/json_api_client.gemspec
+++ b/json_api_client.gemspec
@@ -11,15 +11,16 @@ Gem::Specification.new do |s|
   s.description = 'Build client libraries compliant with specification defined by jsonapi.org'
   s.summary = 'Build client libraries compliant with specification defined by jsonapi.org'
 
-  s.add_dependency "activesupport", '>= 3.2.0'
-  s.add_dependency "faraday", '>= 0.15.2', '< 2.0'
-  s.add_dependency "faraday_middleware", '>= 0.9.0', '< 2.0'
+  s.add_dependency "activesupport", '>= 6.0.0'
+  s.add_dependency "faraday", '>= 1.10', '< 3.0'
+  s.add_dependency "faraday-gzip", '>= 1.0', '< 3.0'
   s.add_dependency "addressable", '~> 2.2'
-  s.add_dependency "activemodel", '>= 3.2.0'
+  s.add_dependency "activemodel", '>= 6.0.0'
   s.add_dependency "rack", '>= 0.2'
 
   s.add_development_dependency "webmock", '~> 3.5.1'
   s.add_development_dependency "mocha"
+  s.add_development_dependency "appraisal"
 
   s.license = "MIT"
 
diff --git a/lib/json_api_client.rb b/lib/json_api_client.rb
index b4082727..f261a019 100644
--- a/lib/json_api_client.rb
+++ b/lib/json_api_client.rb
@@ -1,5 +1,5 @@
 require 'faraday'
-require 'faraday_middleware'
+require 'faraday/gzip'
 require 'json'
 require 'addressable/uri'
 require 'json_api_client/formatter'
diff --git a/lib/json_api_client/connection.rb b/lib/json_api_client/connection.rb
index d7e9ab33..c7bfa8eb 100644
--- a/lib/json_api_client/connection.rb
+++ b/lib/json_api_client/connection.rb
@@ -13,8 +13,8 @@ def initialize(options = {})
         builder.request :json
         builder.use Middleware::JsonRequest
         builder.use Middleware::Status, status_middleware_options
-        builder.use Middleware::ParseJson
-        builder.use ::FaradayMiddleware::Gzip
+        builder.response :json
+        builder.use ::Faraday::Gzip::Middleware
         builder.adapter(*adapter_options)
       end
       yield(self) if block_given?
@@ -24,7 +24,7 @@ def initialize(options = {})
     #   inserted middleware will run after json parsed
     def use(middleware, *args, &block)
       return if faraday.builder.locked?
-      faraday.builder.insert_before(Middleware::ParseJson, middleware, *args, &block)
+      faraday.builder.insert_before(::Faraday::Response::Json, middleware, *args, &block)
     end
 
     def delete(middleware)
diff --git a/lib/json_api_client/middleware.rb b/lib/json_api_client/middleware.rb
index ed44a367..88627215 100644
--- a/lib/json_api_client/middleware.rb
+++ b/lib/json_api_client/middleware.rb
@@ -1,7 +1,6 @@
 module JsonApiClient
   module Middleware
     autoload :JsonRequest, 'json_api_client/middleware/json_request'
-    autoload :ParseJson, 'json_api_client/middleware/parse_json'
     autoload :Status, 'json_api_client/middleware/status'
   end
-end
\ No newline at end of file
+end
diff --git a/lib/json_api_client/middleware/parse_json.rb b/lib/json_api_client/middleware/parse_json.rb
deleted file mode 100644
index 02141a64..00000000
--- a/lib/json_api_client/middleware/parse_json.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-module JsonApiClient
-  module Middleware
-    class ParseJson < Faraday::Middleware
-
-      def call(environment)
-        @app.call(environment).on_complete do |env|
-          if process_response_type?(response_type(env))
-            env[:raw_body] = env[:body]
-            env[:body] = parse(env[:body])
-          end
-        end
-      end
-
-      private
-
-      def parse(body)
-        ::JSON.parse(body) unless body.strip.empty?
-      end
-
-      def response_type(env)
-        type = env[:response_headers]['Content-Type'].to_s
-        type = type.split(';', 2).first if type.index(';')
-        type
-      end
-
-      def process_response_type?(type)
-        !!type.match(/\bjson$/)
-      end
-    end
-  end
-end
\ No newline at end of file