diff --git a/dmemcache.inc b/dmemcache.inc
index 31759bf..02999eb 100644
--- a/dmemcache.inc
+++ b/dmemcache.inc
@@ -34,10 +34,10 @@ function dmemcache_set($key, $value, $exp = 0, $bin = 'cache') {
   $full_key = dmemcache_key($key, $bin);
   $success = FALSE;
   if ($mc = dmemcache_object($bin)) {
-    if (class_exists('Memcached')) {
+    if ($mc instanceof Memcached) {
       $success = $mc->set($full_key, $value, $exp);
     }
-    else {
+    elseif ($mc instanceof Memcache) {
       $success = $mc->set($full_key, $value, MEMCACHE_COMPRESSED, $exp);
     }
   }
@@ -75,10 +75,10 @@ function dmemcache_add($key, $value, $exp = 0, $bin = 'cache', $mc = NULL, $flag
   $full_key = dmemcache_key($key, $bin);
   $success = FALSE;
   if ($mc || ($mc = dmemcache_object($bin))) {
-    if (class_exists('Memcached')) {
+    if ($mc instanceof Memcached) {
       $success = $mc->add($full_key, $value, $exp);
     }
-    else {
+    elseif ($mc instanceof Memcache) {
       $success = $mc->add($full_key, $value, $flag, $exp);
     }
   }
@@ -144,10 +144,10 @@ function dmemcache_get_multi($keys, $bin = 'cache', $mc = NULL) {
   }
   $results = array();
   if ($mc || ($mc = dmemcache_object($bin))) {
-    if (class_exists('Memcached')) {
+    if ($mc instanceof Memcached) {
       $results = $mc->getMulti($full_keys);
     }
-    else {
+    elseif ($mc instanceof Memcache) {
       $results = $mc->get($full_keys);
     }
   }
@@ -210,18 +210,18 @@ function dmemcache_stats($bin = 'cache', $type = '') {
     // If $type is 'default', then no parameter should be passed to the 
     // Memcache memcache_get_extended_stats() function.
     if ($type == 'default' || $type == '') {
-      if (class_exists('Memcached')) {
+      if ($mc instanceof Memcached) {
         return $mc->getStats();
       }
-      else if (class_exists('Memcache')) {
+      elseif ($mc instanceof Memcache) {
         return $mc->getExtendedStats();
       }
     }
     else {
-      if (class_exists('Memcached')) {
+      if ($mc instanceof Memcached) {
         return $mc->getStats();        
       }
-      else if (class_exists('Memcache')) {
+      elseif ($mc instanceof Memcache) {
         return $mc->getExtendedStats($type);
       }
     }
@@ -242,7 +242,22 @@ function dmemcache_stats($bin = 'cache', $type = '') {
  * @return an Memcache object or FALSE.
  */
 function dmemcache_object($bin = NULL, $flush = FALSE) {
-  static $memcacheCache = array(), $memcache_servers, $memcache_bins;
+  static $extension, $memcacheCache = array(), $memcache_servers, $memcache_bins;
+
+  if (!isset($extension)) {
+    // If an extension is specified in settings.php, use that when available.
+    $preferred = variable_get('memcache_extension', NULL);
+    if (isset($preferred) && class_exists($preferred)) {
+      $extension = $preferred;
+    }
+    // If no extension is set, default to Memcache.
+    elseif (class_exists('Memcache')) {
+      $extension = 'Memcache';
+    }
+    elseif (class_exists('Memcached')) {
+      $extension = 'Memcached';
+    }
+  }
 
   if ($flush) {
     foreach ($memcacheCache as $cluster) {
@@ -273,7 +288,7 @@ function dmemcache_object($bin = NULL, $flush = FALSE) {
     }
     else {
       // Create a new Memcache object. Each cluster gets its own Memcache object.
-      if (class_exists('Memcached')) {
+      if ($extension == 'Memcached') {
         $memcache = new Memcached;
         $default_opts = array(
           Memcached::OPT_COMPRESSION => FALSE,
@@ -287,7 +302,7 @@ function dmemcache_object($bin = NULL, $flush = FALSE) {
           $memcache->setOption($key, $value);
         }
       }
-      else if (class_exists('Memcache')) {
+      elseif ($extension == 'Memcache') {
         $memcache = new Memcache;
       }
       else {
@@ -303,14 +318,14 @@ function dmemcache_object($bin = NULL, $flush = FALSE) {
           list($host, $port) = explode(':', $s);
 
           // This is a server that belongs to this cluster.
-          if (!class_exists('Memcached') && !$init) {
+          if ($memcache instanceof Memcache && !$init) {
             // If using PECL memcache extension, use ->connect for first server
             if ($memcache->connect($host, $port)) {
               $init = TRUE;
             }
           }
           else {
-            if ($memcache->addServer($host, $port) && !$init) {
+            if ($memcache instanceof Memcached && $memcache->addServer($host, $port) && !$init) {
               $init = TRUE;
             }
           }
