diff --git a/lib/geocoder.rb b/lib/geocoder.rb
index 7a2303a2623a0e2e10b721e215c2a8acfe4e9099..d64d4d880086c4a9ae4726047583a2a9726d122f 100644
--- a/lib/geocoder.rb
+++ b/lib/geocoder.rb
@@ -1,6 +1,5 @@
 require "geocoder/configuration"
 require "geocoder/calculations"
-require "geocoder/result"
 require "geocoder/active_record"
 require "geocoder/railtie"
 
diff --git a/lib/geocoder/lookups/base.rb b/lib/geocoder/lookups/base.rb
index 65d0f4dbc0332fdb20c435a7339c8f90f9cbeb3a..724ca5c1558e4a405b45bce68d5d686436e34ebd 100644
--- a/lib/geocoder/lookups/base.rb
+++ b/lib/geocoder/lookups/base.rb
@@ -43,7 +43,7 @@ module Geocoder
       # Class of the result objects
       #
       def result_class
-        fail
+        eval("Geocoder::Result::#{self.class.to_s.split(":").last}")
       end
 
       ##
diff --git a/lib/geocoder/lookups/google.rb b/lib/geocoder/lookups/google.rb
index 3889bf1e503524db7784dc13c74a0bd2a1485c66..5b621adbb92e8fd77c06b8caad3c2d0f04cecb95 100644
--- a/lib/geocoder/lookups/google.rb
+++ b/lib/geocoder/lookups/google.rb
@@ -1,42 +1,19 @@
 require 'geocoder/lookups/base'
+require "geocoder/results/google"
 
 module Geocoder::Lookup
   class Google < Base
 
-    def coordinates(address)
-      if (results = search(address)).size > 0
-        place = results.first.geometry['location']
-        ['lat', 'lng'].map{ |i| place[i] }
-      end
-    end
-
-    def address(latitude, longitude)
-      if (results = search(latitude, longitude)).size > 0
-        results.first.formatted_address
-      end
-    end
-
-    def search(*args)
-      return [] if args[0].blank?
-      doc = parsed_response(args.join(","), args.size == 2)
-      [].tap do |results|
-        if doc
-          doc['results'].each{ |r| results << Geocoder::Result.new(r) }
-        end
-      end
-    end
-
-
     private # ---------------------------------------------------------------
 
     ##
     # Returns a parsed Google geocoder search result (hash).
     # Returns nil if non-200 HTTP response, timeout, or other error.
     #
-    def parsed_response(query, reverse = false)
+    def results(query, reverse = false)
       doc = fetch_data(query, reverse)
       case doc['status']; when "OK"
-        doc
+        doc['results']
       when "OVER_QUERY_LIMIT"
         warn "Google Geocoding API error: over query limit."
       when "REQUEST_DENIED"
diff --git a/lib/geocoder/results/base.rb b/lib/geocoder/results/base.rb
new file mode 100644
index 0000000000000000000000000000000000000000..4c492aeafe13c00d4b21a7ee62f4eb42301bc6bd
--- /dev/null
+++ b/lib/geocoder/results/base.rb
@@ -0,0 +1,28 @@
+module Geocoder
+  module Result
+    class Base
+      attr_accessor :data
+
+      ##
+      # Takes a hash of result data from a parsed Google result document.
+      #
+      def initialize(data)
+        @data = data
+      end
+
+      ##
+      # A two-element array: [lat, lon].
+      #
+      def coordinates
+        fail
+      end
+
+      ##
+      # A string in the given format.
+      #
+      def address(format = :full)
+        fail
+      end
+    end
+  end
+end
diff --git a/lib/geocoder/result.rb b/lib/geocoder/results/google.rb
similarity index 74%
rename from lib/geocoder/result.rb
rename to lib/geocoder/results/google.rb
index e63f2263dda3a3706ad622f6926497a6744dc076..01d7b69a56a684589cc05ec8184a9188244de03c 100644
--- a/lib/geocoder/result.rb
+++ b/lib/geocoder/results/google.rb
@@ -1,12 +1,14 @@
-module Geocoder
-  class Result
-    attr_accessor :data
+require 'geocoder/results/base'
 
-    ##
-    # Takes a hash of result data from a parsed Google result document.
-    #
-    def initialize(data)
-      @data = data
+module Geocoder::Result
+  class Google < Base
+
+    def coordinates
+      ['lat', 'lng'].map{ |i| geometry['location'][i] }
+    end
+
+    def address(format = :full)
+      formatted_address
     end
 
     def types