[evolution-data-server/camel-gobject: 205/331] Use thread-safe G_DEFINE_TYPE macros.



commit c440b4255f28269e34697fbdb804166dfe6d98a0
Author: Matthew Barnes <mbarnes redhat com>
Date:   Sun Feb 28 14:21:08 2010 -0500

    Use thread-safe G_DEFINE_TYPE macros.

 camel/camel-address.c                              |   28 +----
 camel/camel-block-file.c                           |   60 ++---------
 camel/camel-certdb.c                               |   27 +----
 camel/camel-cipher-context.c                       |   29 +----
 camel/camel-data-cache.c                           |   26 +----
 camel/camel-data-wrapper.c                         |   29 +----
 camel/camel-digest-folder.c                        |   31 +-----
 camel/camel-digest-store.c                         |   26 +----
 camel/camel-digest-summary.c                       |   26 +----
 camel/camel-disco-diary.c                          |   27 +----
 camel/camel-disco-folder.c                         |   33 ++-----
 camel/camel-disco-store.c                          |   32 ++----
 camel/camel-filter-driver.c                        |   29 +----
 camel/camel-folder-search.c                        |   29 +----
 camel/camel-folder-summary.c                       |   29 +----
 camel/camel-folder.c                               |   35 ++-----
 camel/camel-gpg-context.c                          |   25 +----
 camel/camel-html-parser.c                          |   31 ++----
 camel/camel-http-stream.c                          |   30 +-----
 camel/camel-index.c                                |   77 +++-----------
 camel/camel-internet-address.c                     |   23 +----
 camel/camel-medium.c                               |   29 +----
 camel/camel-mime-filter-basic.c                    |   25 +----
 camel/camel-mime-filter-bestenc.c                  |   25 +----
 camel/camel-mime-filter-canon.c                    |   24 +----
 camel/camel-mime-filter-charset.c                  |   27 +----
 camel/camel-mime-filter-crlf.c                     |   25 +----
 camel/camel-mime-filter-enriched.c                 |   25 +----
 camel/camel-mime-filter-from.c                     |   27 +----
 camel/camel-mime-filter-gzip.c                     |   27 +----
 camel/camel-mime-filter-html.c                     |   27 +----
 camel/camel-mime-filter-index.c                    |   27 +----
 camel/camel-mime-filter-linewrap.c                 |   25 +----
 camel/camel-mime-filter-pgp.c                      |   25 +----
 camel/camel-mime-filter-progress.c                 |   25 +----
 camel/camel-mime-filter-save.c                     |   25 +----
 camel/camel-mime-filter-tohtml.c                   |   27 +----
 camel/camel-mime-filter-windows.c                  |   27 +----
 camel/camel-mime-filter-yenc.c                     |   25 +----
 camel/camel-mime-filter.c                          |   27 +----
 camel/camel-mime-message.c                         |   59 ++++-------
 camel/camel-mime-parser.c                          |   31 +-----
 camel/camel-mime-part.c                            |   29 +----
 camel/camel-multipart-encrypted.c                  |   32 +-----
 camel/camel-multipart-signed.c                     |   32 +-----
 camel/camel-multipart.c                            |   33 +-----
 camel/camel-news-address.c                         |   18 +---
 camel/camel-nntp-address.c                         |   25 +----
 camel/camel-object.c                               |   25 +----
 camel/camel-offline-folder.c                       |   34 ++-----
 camel/camel-offline-journal.c                      |   28 +----
 camel/camel-offline-store.c                        |   28 +----
 camel/camel-partition-table.c                      |   55 ++--------
 camel/camel-sasl-anonymous.c                       |   25 +----
 camel/camel-sasl-cram-md5.c                        |   24 +----
 camel/camel-sasl-digest-md5.c                      |   28 +----
 camel/camel-sasl-gssapi.c                          |   27 +----
 camel/camel-sasl-login.c                           |   24 +----
 camel/camel-sasl-ntlm.c                            |   25 +----
 camel/camel-sasl-plain.c                           |   24 +----
 camel/camel-sasl-popb4smtp.c                       |   25 +----
 camel/camel-sasl.c                                 |   29 +----
 camel/camel-seekable-stream.c                      |   26 +----
 camel/camel-seekable-substream.c                   |   26 +----
 camel/camel-service.c                              |   31 +-----
 camel/camel-session.c                              |   27 +----
 camel/camel-smime-context.c                        |   25 +----
 camel/camel-store-summary.c                        |   27 +----
 camel/camel-store.c                                |   56 ++++------
 camel/camel-stream-buffer.c                        |   29 +----
 camel/camel-stream-filter.c                        |   27 +----
 camel/camel-stream-fs.c                            |   27 +----
 camel/camel-stream-mem.c                           |   27 +----
 camel/camel-stream-null.c                          |   23 +----
 camel/camel-stream-process.c                       |   28 +----
 camel/camel-stream-vfs.c                           |   28 +----
 camel/camel-stream.c                               |   23 +----
 camel/camel-tcp-stream-raw.c                       |   28 +----
 camel/camel-tcp-stream-ssl.c                       |   31 +-----
 camel/camel-tcp-stream.c                           |   22 +---
 camel/camel-text-index.c                           |  115 +++-----------------
 camel/camel-transport.c                            |   27 +----
 camel/camel-vee-folder.c                           |   37 ++-----
 camel/camel-vee-store.c                            |   30 +-----
 camel/camel-vee-summary.c                          |   25 +----
 camel/camel-vtrash-folder.c                        |   28 +----
 camel/providers/groupwise/camel-groupwise-folder.c |   33 ++-----
 .../providers/groupwise/camel-groupwise-journal.c  |   23 +----
 .../groupwise/camel-groupwise-store-summary.c      |   40 ++-----
 camel/providers/groupwise/camel-groupwise-store.c  |   35 ++-----
 .../providers/groupwise/camel-groupwise-summary.c  |   52 +++------
 .../groupwise/camel-groupwise-transport.c          |   24 +----
 camel/providers/imap/camel-imap-folder.c           |   41 ++-----
 camel/providers/imap/camel-imap-journal.c          |   28 +----
 camel/providers/imap/camel-imap-message-cache.c    |   27 +----
 camel/providers/imap/camel-imap-search.c           |   32 +-----
 camel/providers/imap/camel-imap-store-summary.c    |   40 ++-----
 camel/providers/imap/camel-imap-store.c            |   44 ++------
 camel/providers/imap/camel-imap-summary.c          |   51 +++------
 camel/providers/imap/camel-imap-wrapper.c          |   31 +-----
 camel/providers/imap4/camel-imap4-engine.c         |    4 -
 camel/providers/imap4/camel-imap4-folder.c         |   10 +--
 camel/providers/imap4/camel-imap4-journal.c        |    4 -
 camel/providers/imap4/camel-imap4-search.c         |    6 +-
 camel/providers/imap4/camel-imap4-store-summary.c  |   14 +--
 camel/providers/imap4/camel-imap4-store.c          |    6 +-
 camel/providers/imap4/camel-imap4-stream.c         |    4 -
 camel/providers/imap4/camel-imap4-summary.c        |   20 ++--
 camel/providers/imapx/camel-imapx-stream.c         |    4 -
 camel/providers/local/camel-local-folder.c         |   40 ++-----
 camel/providers/local/camel-local-store.c          |   31 ++----
 camel/providers/local/camel-local-summary.c        |   40 ++-----
 camel/providers/local/camel-maildir-folder.c       |   33 ++----
 camel/providers/local/camel-maildir-store.c        |   31 ++----
 camel/providers/local/camel-maildir-summary.c      |   39 ++-----
 camel/providers/local/camel-mbox-folder.c          |   32 +-----
 camel/providers/local/camel-mbox-store.c           |   27 +----
 camel/providers/local/camel-mbox-summary.c         |   58 ++++-------
 camel/providers/local/camel-mh-folder.c            |   25 +----
 camel/providers/local/camel-mh-store.c             |   33 ++----
 camel/providers/local/camel-mh-summary.c           |   27 +----
 camel/providers/local/camel-spool-folder.c         |   28 +----
 camel/providers/local/camel-spool-store.c          |   25 +----
 camel/providers/local/camel-spool-summary.c        |   28 +----
 camel/providers/nntp/camel-nntp-folder.c           |   39 ++-----
 camel/providers/nntp/camel-nntp-store-summary.c    |   40 ++-----
 camel/providers/nntp/camel-nntp-store.c            |   37 ++-----
 camel/providers/nntp/camel-nntp-stream.c           |   32 +-----
 camel/providers/nntp/camel-nntp-summary.c          |   35 ++-----
 camel/providers/pop3/camel-pop3-engine.c           |   26 +----
 camel/providers/pop3/camel-pop3-folder.c           |   25 +----
 camel/providers/pop3/camel-pop3-store.c            |   33 ++----
 camel/providers/pop3/camel-pop3-stream.c           |   32 +-----
 .../providers/sendmail/camel-sendmail-transport.c  |   21 +---
 camel/providers/smtp/camel-smtp-transport.c        |   30 +-----
 camel/tests/lib/session.c                          |   22 ++---
 camel/tests/smime/pgp.c                            |   29 +----
 137 files changed, 792 insertions(+), 3288 deletions(-)
---
diff --git a/camel/camel-address.c b/camel/camel-address.c
index 3237c0f..03008ee 100644
--- a/camel/camel-address.c
+++ b/camel/camel-address.c
@@ -20,7 +20,7 @@
 
 #include "camel-address.h"
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelAddress, camel_address, CAMEL_TYPE_OBJECT)
 
 static void
 address_finalize (GObject *object)
@@ -31,44 +31,24 @@ address_finalize (GObject *object)
 	g_ptr_array_free (address->addresses, TRUE);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_address_parent_class)->finalize (object);
 }
 
 static void
-address_class_init (CamelAddressClass *class)
+camel_address_class_init (CamelAddressClass *class)
 {
 	GObjectClass *object_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->finalize = address_finalize;
 }
 
 static void
-address_init (CamelAddress *address)
+camel_address_init (CamelAddress *address)
 {
 	address->addresses = g_ptr_array_new();
 }
 
-GType
-camel_address_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OBJECT,
-			"CamelAddress",
-			sizeof (CamelAddressClass),
-			(GClassInitFunc) address_class_init,
-			sizeof (CamelAddress),
-			(GInstanceInitFunc) address_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_address_new:
  *
diff --git a/camel/camel-block-file.c b/camel/camel-block-file.c
index e4b162d..263f035 100644
--- a/camel/camel-block-file.c
+++ b/camel/camel-block-file.c
@@ -43,8 +43,6 @@
 
 #define d(x) /*(printf("%s(%d):%s: ",  __FILE__, __LINE__, __PRETTY_FUNCTION__),(x))*/
 
-static gpointer block_file_parent_class;
-
 /* Locks must be obtained in the order defined */
 
 struct _CamelBlockFilePrivate {
@@ -80,6 +78,8 @@ static gint block_file_threshhold = 10;
 static gint sync_nolock(CamelBlockFile *bs);
 static gint sync_block_nolock(CamelBlockFile *bs, CamelBlock *bl);
 
+G_DEFINE_TYPE (CamelBlockFile, camel_block_file, CAMEL_TYPE_OBJECT)
+
 static gint
 block_file_validate_root(CamelBlockFile *bs)
 {
@@ -188,16 +188,14 @@ block_file_finalize(GObject *object)
 	g_free(p);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (block_file_parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_block_file_parent_class)->finalize (object);
 }
 
 static void
-block_file_class_init(CamelBlockFileClass *class)
+camel_block_file_class_init(CamelBlockFileClass *class)
 {
 	GObjectClass *object_class;
 
-	block_file_parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->finalize = block_file_finalize;
 
@@ -212,7 +210,7 @@ block_hash_func(gconstpointer v)
 }
 
 static void
-block_file_init(CamelBlockFile *bs)
+camel_block_file_init(CamelBlockFile *bs)
 {
 	struct _CamelBlockFilePrivate *p;
 
@@ -250,24 +248,6 @@ block_file_init(CamelBlockFile *bs)
 	UNLOCK(block_file_lock);
 }
 
-GType
-camel_block_file_get_type(void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OBJECT,
-			"CamelBlockFile",
-			sizeof (CamelBlockFileClass),
-			(GClassInitFunc) block_file_class_init,
-			sizeof (CamelBlockFile),
-			(GInstanceInitFunc) block_file_init,
-			0);
-
-	return type;
-}
-
 /* 'use' a block file for io */
 static gint
 block_file_use(CamelBlockFile *bs)
@@ -830,8 +810,6 @@ gint camel_block_file_sync(CamelBlockFile *bs)
 
 /* ********************************************************************** */
 
-static gpointer key_file_parent_class;
-
 struct _CamelKeyFilePrivate {
 	struct _CamelKeyFilePrivate *next;
 	struct _CamelKeyFilePrivate *prev;
@@ -853,6 +831,8 @@ static CamelDList key_file_active_list = CAMEL_DLIST_INITIALISER(key_file_active
 static gint key_file_count = 0;
 static const gint key_file_threshhold = 10;
 
+G_DEFINE_TYPE (CamelKeyFile, camel_key_file, CAMEL_TYPE_OBJECT)
+
 static void
 key_file_finalize(GObject *object)
 {
@@ -876,22 +856,20 @@ key_file_finalize(GObject *object)
 	g_free(p);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (key_file_parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_key_file_parent_class)->finalize (object);
 }
 
 static void
-key_file_class_init(CamelKeyFileClass *class)
+camel_key_file_class_init(CamelKeyFileClass *class)
 {
 	GObjectClass *object_class;
 
-	key_file_parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->finalize = key_file_finalize;
 }
 
 static void
-key_file_init(CamelKeyFile *bs)
+camel_key_file_init(CamelKeyFile *bs)
 {
 	struct _CamelKeyFilePrivate *p;
 
@@ -905,24 +883,6 @@ key_file_init(CamelKeyFile *bs)
 	UNLOCK(key_file_lock);
 }
 
-GType
-camel_key_file_get_type(void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OBJECT,
-			"CamelKeyFile",
-			sizeof (CamelKeyFileClass),
-			(GClassInitFunc) key_file_class_init,
-			sizeof (CamelKeyFile),
-			(GInstanceInitFunc) key_file_init,
-			0);
-
-	return type;
-}
-
 /* 'use' a key file for io */
 static gint
 key_file_use(CamelKeyFile *bs)
diff --git a/camel/camel-certdb.c b/camel/camel-certdb.c
index 3b09706..7c23dca 100644
--- a/camel/camel-certdb.c
+++ b/camel/camel-certdb.c
@@ -57,7 +57,7 @@ static void certdb_cert_free (CamelCertDB *certdb, CamelCert *cert);
 static const gchar *cert_get_string (CamelCertDB *certdb, CamelCert *cert, gint string);
 static void cert_set_string (CamelCertDB *certdb, CamelCert *cert, gint string, const gchar *value);
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelCertDB, camel_certdb, CAMEL_TYPE_OBJECT)
 
 static void
 certdb_finalize (GObject *object)
@@ -85,15 +85,14 @@ certdb_finalize (GObject *object)
 	g_mutex_free (priv->ref_lock);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_certdb_parent_class)->finalize (object);
 }
 
 static void
-certdb_class_init (CamelCertDBClass *class)
+camel_certdb_class_init (CamelCertDBClass *class)
 {
 	GObjectClass *object_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelCertDBPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -111,7 +110,7 @@ certdb_class_init (CamelCertDBClass *class)
 }
 
 static void
-certdb_init (CamelCertDB *certdb)
+camel_certdb_init (CamelCertDB *certdb)
 {
 	certdb->priv = CAMEL_CERTDB_GET_PRIVATE (certdb);
 
@@ -132,24 +131,6 @@ certdb_init (CamelCertDB *certdb)
 	certdb->priv->ref_lock = g_mutex_new ();
 }
 
-GType
-camel_certdb_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OBJECT,
-			"CamelCertDB",
-			sizeof (CamelCertDBClass),
-			(GClassInitFunc) certdb_class_init,
-			sizeof (CamelCertDB),
-			(GInstanceInitFunc) certdb_init,
-			0);
-
-	return type;
-}
-
 CamelCertDB *
 camel_certdb_new (void)
 {
diff --git a/camel/camel-cipher-context.c b/camel/camel-cipher-context.c
index c1648d1..993c87c 100644
--- a/camel/camel-cipher-context.c
+++ b/camel/camel-cipher-context.c
@@ -59,7 +59,7 @@ enum {
 	PROP_SESSION
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelCipherContext, camel_cipher_context, CAMEL_TYPE_OBJECT)
 
 static gint
 cipher_sign (CamelCipherContext *ctx,
@@ -688,7 +688,7 @@ cipher_context_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose () method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_cipher_context_parent_class)->dispose (object);
 }
 
 static void
@@ -701,15 +701,14 @@ cipher_context_finalize (GObject *object)
 	g_mutex_free (priv->lock);
 
 	/* Chain up to parent's finalize () method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_cipher_context_parent_class)->finalize (object);
 }
 
 static void
-cipher_context_class_init (CamelCipherContextClass *class)
+camel_cipher_context_class_init (CamelCipherContextClass *class)
 {
 	GObjectClass *object_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelCipherContextPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -740,30 +739,12 @@ cipher_context_class_init (CamelCipherContextClass *class)
 }
 
 static void
-cipher_context_init (CamelCipherContext *context)
+camel_cipher_context_init (CamelCipherContext *context)
 {
 	context->priv = CAMEL_CIPHER_CONTEXT_GET_PRIVATE (context);
 	context->priv->lock = g_mutex_new ();
 }
 
-GType
-camel_cipher_context_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OBJECT,
-			"CamelCipherContext",
-			sizeof (CamelCipherContextClass),
-			(GClassInitFunc) cipher_context_class_init,
-			sizeof (CamelCipherContext),
-			(GInstanceInitFunc) cipher_context_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_cipher_context_new:
  * @session: CamelSession
diff --git a/camel/camel-data-cache.c b/camel/camel-data-cache.c
index a07d79b..f036def 100644
--- a/camel/camel-data-cache.c
+++ b/camel/camel-data-cache.c
@@ -73,7 +73,7 @@ enum {
 	PROP_PATH
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelDataCache, camel_data_cache, CAMEL_TYPE_OBJECT)
 
 static void
 data_cache_set_property (GObject *object,
@@ -120,15 +120,14 @@ data_cache_finalize (GObject *object)
 	g_free (priv->path);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_data_cache_parent_class)->finalize (object);
 }
 
 static void
-data_cache_class_init (CamelDataCacheClass *class)
+camel_data_cache_class_init (CamelDataCacheClass *class)
 {
 	GObjectClass *object_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelDataCachePrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -149,7 +148,7 @@ data_cache_class_init (CamelDataCacheClass *class)
 }
 
 static void
-data_cache_init (CamelDataCache *data_cache)
+camel_data_cache_init (CamelDataCache *data_cache)
 {
 	CamelObjectBag *busy_bag;
 
@@ -164,23 +163,6 @@ data_cache_init (CamelDataCache *data_cache)
 	data_cache->priv->expire_access = -1;
 }
 
-GType
-camel_data_cache_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OBJECT, "CamelDataCache",
-			sizeof (CamelDataCacheClass),
-			(GClassInitFunc) data_cache_class_init,
-			sizeof (CamelDataCache),
-			(GInstanceInitFunc) data_cache_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_data_cache_new:
  * @path: Base path of cache, subdirectories will be created here.
diff --git a/camel/camel-data-wrapper.c b/camel/camel-data-wrapper.c
index e377513..adccb97 100644
--- a/camel/camel-data-wrapper.c
+++ b/camel/camel-data-wrapper.c
@@ -39,7 +39,7 @@
 	(G_TYPE_INSTANCE_GET_PRIVATE \
 	((obj), CAMEL_TYPE_DATA_WRAPPER, CamelDataWrapperPrivate))
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelDataWrapper, camel_data_wrapper, CAMEL_TYPE_OBJECT)
 
 static void
 data_wrapper_dispose (GObject *object)
@@ -57,7 +57,7 @@ data_wrapper_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_data_wrapper_parent_class)->dispose (object);
 }
 
 static void
@@ -68,7 +68,7 @@ data_wrapper_finalize (GObject *object)
 	pthread_mutex_destroy (&data_wrapper->priv->stream_lock);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_data_wrapper_parent_class)->finalize (object);
 }
 
 static gssize
@@ -195,11 +195,10 @@ data_wrapper_is_offline (CamelDataWrapper *data_wrapper)
 }
 
 static void
-data_wrapper_class_init (CamelDataWrapperClass *class)
+camel_data_wrapper_class_init (CamelDataWrapperClass *class)
 {
 	GObjectClass *object_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelDataWrapperPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -217,7 +216,7 @@ data_wrapper_class_init (CamelDataWrapperClass *class)
 }
 
 static void
-data_wrapper_init (CamelDataWrapper *data_wrapper)
+camel_data_wrapper_init (CamelDataWrapper *data_wrapper)
 {
 	data_wrapper->priv = CAMEL_DATA_WRAPPER_GET_PRIVATE (data_wrapper);
 
@@ -229,24 +228,6 @@ data_wrapper_init (CamelDataWrapper *data_wrapper)
 	data_wrapper->offline = FALSE;
 }
 
-GType
-camel_data_wrapper_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OBJECT,
-			"CamelDataWrapper",
-			sizeof (CamelDataWrapperClass),
-			(GClassInitFunc) data_wrapper_class_init,
-			sizeof (CamelDataWrapper),
-			(GInstanceInitFunc) data_wrapper_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_data_wrapper_new:
  *
diff --git a/camel/camel-digest-folder.c b/camel/camel-digest-folder.c
index 0bbc38c..d389954 100644
--- a/camel/camel-digest-folder.c
+++ b/camel/camel-digest-folder.c
@@ -46,8 +46,6 @@ struct _CamelDigestFolderPrivate {
 #define CAMEL_DIGEST_FOLDER_LOCK(f, l) (g_mutex_lock(((CamelDigestFolder *)f)->priv->l))
 #define CAMEL_DIGEST_FOLDER_UNLOCK(f, l) (g_mutex_unlock(((CamelDigestFolder *)f)->priv->l))
 
-static gpointer parent_class;
-
 static gboolean digest_refresh_info (CamelFolder *folder, GError **error);
 static gboolean digest_sync (CamelFolder *folder, gboolean expunge, GError **error);
 static const gchar *digest_get_full_name (CamelFolder *folder);
@@ -70,6 +68,8 @@ static GPtrArray *digest_search_by_uids (CamelFolder *folder, const gchar *expre
 
 static void digest_search_free (CamelFolder *folder, GPtrArray *result);
 
+G_DEFINE_TYPE (CamelDigestFolder, camel_digest_folder, CAMEL_TYPE_FOLDER)
+
 static void
 digest_dispose (GObject *object)
 {
@@ -95,7 +95,7 @@ digest_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_digest_folder_parent_class)->dispose (object);
 }
 
 static void
@@ -108,16 +108,15 @@ digest_finalize (GObject *object)
 	g_mutex_free (priv->search_lock);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_digest_folder_parent_class)->finalize (object);
 }
 
 static void
-digest_folder_class_init (CamelDigestFolderClass *class)
+camel_digest_folder_class_init (CamelDigestFolderClass *class)
 {
 	GObjectClass *object_class;
 	CamelFolderClass *folder_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelDigestFolderPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -138,7 +137,7 @@ digest_folder_class_init (CamelDigestFolderClass *class)
 }
 
 static void
-digest_folder_init (CamelDigestFolder *digest_folder)
+camel_digest_folder_init (CamelDigestFolder *digest_folder)
 {
 	CamelFolder *folder = CAMEL_FOLDER (digest_folder);
 
@@ -152,24 +151,6 @@ digest_folder_init (CamelDigestFolder *digest_folder)
 	digest_folder->priv->search_lock = g_mutex_new ();
 }
 
-GType
-camel_digest_folder_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_FOLDER,
-			"CamelDigestFolder",
-			sizeof (CamelDigestFolderClass),
-			(GClassInitFunc) digest_folder_class_init,
-			sizeof (CamelDigestFolder),
-			(GInstanceInitFunc) digest_folder_init,
-			0);
-
-	return type;
-}
-
 static gboolean
 multipart_contains_message_parts (CamelMultipart *multipart)
 {
diff --git a/camel/camel-digest-store.c b/camel/camel-digest-store.c
index 5d80545..021a2ba 100644
--- a/camel/camel-digest-store.c
+++ b/camel/camel-digest-store.c
@@ -41,15 +41,13 @@ static CamelFolder *digest_get_junk  (CamelStore *store, GError **error);
 static CamelFolderInfo *digest_get_folder_info (CamelStore *store, const gchar *top, guint32 flags, GError **error);
 
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelDigestStore, camel_digest_store, CAMEL_TYPE_STORE)
 
 static void
-digest_store_class_init (CamelDigestStoreClass *class)
+camel_digest_store_class_init (CamelDigestStoreClass *class)
 {
 	CamelStoreClass *store_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	store_class = CAMEL_STORE_CLASS (class);
 	store_class->get_folder = digest_get_folder;
 	store_class->rename_folder = digest_rename_folder;
@@ -62,7 +60,7 @@ digest_store_class_init (CamelDigestStoreClass *class)
 }
 
 static void
-digest_store_init (CamelDigestStore *digest_store)
+camel_digest_store_init (CamelDigestStore *digest_store)
 {
 	CamelStore *store = CAMEL_STORE (digest_store);
 
@@ -70,24 +68,6 @@ digest_store_init (CamelDigestStore *digest_store)
 	store->flags &= ~(CAMEL_STORE_VTRASH | CAMEL_STORE_VJUNK);
 }
 
-GType
-camel_digest_store_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_STORE,
-			"CamelDigestStore",
-			sizeof (CamelDigestStoreClass),
-			(GClassInitFunc) digest_store_class_init,
-			sizeof (CamelDigestStore),
-			(GInstanceInitFunc) digest_store_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_digest_store_new:
  * @url:
diff --git a/camel/camel-digest-summary.c b/camel/camel-digest-summary.c
index e94cb47..0d15742 100644
--- a/camel/camel-digest-summary.c
+++ b/camel/camel-digest-summary.c
@@ -28,22 +28,20 @@
 
 #define CAMEL_DIGEST_SUMMARY_VERSION 0
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelDigestSummary, camel_digest_summary, CAMEL_TYPE_FOLDER_SUMMARY)
 
 static void
-digest_summary_class_init (CamelDigestSummaryClass *class)
+camel_digest_summary_class_init (CamelDigestSummaryClass *class)
 {
 	CamelFolderSummaryClass *folder_summary_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	folder_summary_class = CAMEL_FOLDER_SUMMARY_CLASS (class);
 	folder_summary_class->message_info_size = sizeof (CamelMessageInfo);
 	folder_summary_class->content_info_size = sizeof (CamelMessageContentInfo);
 }
 
 static void
-digest_summary_init (CamelDigestSummary *digest_summary)
+camel_digest_summary_init (CamelDigestSummary *digest_summary)
 {
 	CamelFolderSummary *summary;
 
@@ -53,24 +51,6 @@ digest_summary_init (CamelDigestSummary *digest_summary)
 	summary->version += CAMEL_DIGEST_SUMMARY_VERSION;
 }
 
-GType
-camel_digest_summary_get_type(void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_FOLDER_SUMMARY,
-			"CamelDigestSummary",
-			sizeof (CamelDigestSummaryClass),
-			(GClassInitFunc) digest_summary_class_init,
-			sizeof (CamelDigestSummary),
-			(GInstanceInitFunc) digest_summary_init,
-			0);
-
-	return type;
-}
-
 CamelFolderSummary *
 camel_digest_summary_new (void)
 {
diff --git a/camel/camel-disco-diary.c b/camel/camel-disco-diary.c
index 31c7597..14f885c 100644
--- a/camel/camel-disco-diary.c
+++ b/camel/camel-disco-diary.c
@@ -43,7 +43,7 @@
 
 #define d(x)
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelDiscoDiary, camel_disco_diary, CAMEL_TYPE_OBJECT)
 
 static void
 unref_folder (gpointer key, gpointer value, gpointer data)
@@ -77,44 +77,25 @@ disco_diary_finalize (GObject *object)
 	}
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_disco_diary_parent_class)->finalize (object);
 }
 
 static void
-disco_diary_class_init (CamelDiscoDiaryClass *class)
+camel_disco_diary_class_init (CamelDiscoDiaryClass *class)
 {
 	GObjectClass *object_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->finalize = disco_diary_finalize;
 }
 
 static void
-disco_diary_init (CamelDiscoDiary *diary)
+camel_disco_diary_init (CamelDiscoDiary *diary)
 {
 	diary->folders = g_hash_table_new (g_str_hash, g_str_equal);
 	diary->uidmap = g_hash_table_new (g_str_hash, g_str_equal);
 }
 
-GType
-camel_disco_diary_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OBJECT, "CamelDiscoDiary",
-			sizeof (CamelDiscoDiaryClass),
-			(GClassInitFunc) disco_diary_class_init,
-			sizeof (CamelDiscoDiary),
-			(GInstanceInitFunc) disco_diary_init,
-			0);
-
-	return type;
-}
-
 static gint
 diary_encode_uids (CamelDiscoDiary *diary, GPtrArray *uids)
 {
diff --git a/camel/camel-disco-folder.c b/camel/camel-disco-folder.c
index d2a3d43..f37f02d 100644
--- a/camel/camel-disco-folder.c
+++ b/camel/camel-disco-folder.c
@@ -31,7 +31,6 @@
 #include "camel-disco-store.h"
 #include "camel-session.h"
 
-static gpointer parent_class;
 static GSList *disco_folder_properties;
 
 static CamelProperty disco_property_list[] = {
@@ -65,6 +64,8 @@ struct _cdf_sync_msg {
 	CamelFolderChangeInfo *changes;
 };
 
+G_DEFINE_TYPE (CamelDiscoFolder, camel_disco_folder, CAMEL_TYPE_FOLDER)
+
 static void
 cdf_sync_offline(CamelSession *session, CamelSessionThreadMsg *mm)
 {
@@ -125,14 +126,12 @@ cdf_folder_changed(CamelFolder *folder, CamelFolderChangeInfo *changes, gpointer
 }
 
 static void
-disco_folder_class_init (CamelDiscoFolderClass *class)
+camel_disco_folder_class_init (CamelDiscoFolderClass *class)
 {
 	CamelObjectClass *camel_object_class;
 	CamelFolderClass *folder_class;
 	gint ii;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	camel_object_class = CAMEL_OBJECT_CLASS (class);
 	camel_object_class->getv = disco_getv;
 	camel_object_class->setv = disco_setv;
@@ -156,31 +155,13 @@ disco_folder_class_init (CamelDiscoFolderClass *class)
 }
 
 static void
-disco_folder_init (CamelDiscoFolder *disco_folder)
+camel_disco_folder_init (CamelDiscoFolder *disco_folder)
 {
 	camel_object_hook_event (
 		disco_folder, "folder_changed",
 		(CamelObjectEventHookFunc) cdf_folder_changed, NULL);
 }
 
-GType
-camel_disco_folder_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_FOLDER,
-			"CamelDiscoFolder",
-			sizeof (CamelDiscoFolderClass),
-			(GClassInitFunc) disco_folder_class_init,
-			sizeof (CamelDiscoFolder),
-			(GInstanceInitFunc) disco_folder_init,
-			0);
-
-	return type;
-}
-
 static gint
 disco_getv (CamelObject *object,
             GError **error,
@@ -201,7 +182,7 @@ disco_getv (CamelObject *object,
 
 			props.argc = 1;
 			props.argv[0] = *arg;
-			((CamelObjectClass *)parent_class)->getv(object, error, &props);
+			CAMEL_OBJECT_CLASS (camel_disco_folder_parent_class)->getv(object, error, &props);
 			*arg->ca_ptr = g_slist_concat(*arg->ca_ptr, g_slist_copy(disco_folder_properties));
 			break; }
 			/* disco args */
@@ -217,7 +198,7 @@ disco_getv (CamelObject *object,
 	}
 
 	if (count)
-		return ((CamelObjectClass *)parent_class)->getv(object, error, args);
+		return CAMEL_OBJECT_CLASS (camel_disco_folder_parent_class)->getv(object, error, args);
 
 	return 0;
 }
@@ -253,7 +234,7 @@ disco_setv (CamelObject *object,
 	if (save)
 		camel_object_state_write(object);
 
-	return ((CamelObjectClass *)parent_class)->setv(object, error, args);
+	return CAMEL_OBJECT_CLASS (camel_disco_folder_parent_class)->setv(object, error, args);
 }
 
 static gboolean
diff --git a/camel/camel-disco-store.c b/camel/camel-disco-store.c
index 4877a2c..d602c07 100644
--- a/camel/camel-disco-store.c
+++ b/camel/camel-disco-store.c
@@ -35,8 +35,6 @@
 
 #define d(x)
 
-static gpointer parent_class;
-
 static gboolean disco_construct (CamelService *service, CamelSession *session,
 			     CamelProvider *provider, CamelURL *url,
 			     GError **error);
@@ -53,15 +51,14 @@ static void set_status (CamelDiscoStore *disco_store,
 			GError **error);
 static gboolean can_work_offline (CamelDiscoStore *disco_store);
 
+G_DEFINE_TYPE (CamelDiscoStore, camel_disco_store, CAMEL_TYPE_STORE)
 
 static void
-disco_store_class_init (CamelDiscoStoreClass *class)
+camel_disco_store_class_init (CamelDiscoStoreClass *class)
 {
 	CamelServiceClass *service_class;
 	CamelStoreClass *store_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	service_class = CAMEL_SERVICE_CLASS (class);
 	service_class->construct = disco_construct;
 	service_class->connect = disco_connect;
@@ -76,22 +73,9 @@ disco_store_class_init (CamelDiscoStoreClass *class)
 	class->can_work_offline = can_work_offline;
 }
 
-GType
-camel_disco_store_get_type (void)
+static void
+camel_disco_store_init (CamelDiscoStore *disco_store)
 {
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_STORE,
-			"CamelDiscoStore",
-			sizeof (CamelDiscoStoreClass),
-			(GClassInitFunc) disco_store_class_init,
-			sizeof (CamelDiscoStore),
-			NULL,
-			0);
-
-	return type;
 }
 
 static gboolean
@@ -105,7 +89,7 @@ disco_construct (CamelService *service,
 	CamelDiscoStore *disco = CAMEL_DISCO_STORE (service);
 
 	/* Chain up to parent's construct() method. */
-	service_class = CAMEL_SERVICE_CLASS (parent_class);
+	service_class = CAMEL_SERVICE_CLASS (camel_disco_store_parent_class);
 	if (!service_class->construct (service, session, provider, url, error))
 		return FALSE;
 
@@ -126,7 +110,7 @@ disco_connect (CamelService *service,
 
 	status = camel_disco_store_status (store);
 	if (status != CAMEL_DISCO_STORE_OFFLINE) {
-		if (!CAMEL_SERVICE_CLASS (parent_class)->connect (service, error)) {
+		if (!CAMEL_SERVICE_CLASS (camel_disco_store_parent_class)->connect (service, error)) {
 			status = camel_disco_store_status (store);
 			if (status != CAMEL_DISCO_STORE_OFFLINE)
 				return FALSE;
@@ -179,7 +163,7 @@ disco_cancel_connect (CamelService *service)
 
 	/* Fall back */
 	store->status = CAMEL_DISCO_STORE_OFFLINE;
-	CAMEL_SERVICE_CLASS (parent_class)->cancel_connect (service);
+	CAMEL_SERVICE_CLASS (camel_disco_store_parent_class)->cancel_connect (service);
 }
 
 static gboolean
@@ -203,7 +187,7 @@ disco_disconnect (CamelService *service,
 
 	}
 
-	return CAMEL_SERVICE_CLASS (parent_class)->disconnect (service, clean, error);
+	return CAMEL_SERVICE_CLASS (camel_disco_store_parent_class)->disconnect (service, clean, error);
 }
 
 static CamelFolder *
diff --git a/camel/camel-filter-driver.c b/camel/camel-filter-driver.c
index 6ddb363..426f5e6 100644
--- a/camel/camel-filter-driver.c
+++ b/camel/camel-filter-driver.c
@@ -175,7 +175,7 @@ static struct {
 	{ "only-once",         (ESExpFunc *) do_only_once, 0 }
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelFilterDriver, camel_filter_driver, CAMEL_TYPE_OBJECT)
 
 static void
 free_hash_strings (gpointer key, gpointer value, gpointer data)
@@ -203,7 +203,7 @@ filter_driver_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_filter_driver_parent_class)->dispose (object);
 }
 
 static void
@@ -234,15 +234,14 @@ filter_driver_finalize (GObject *object)
 	}
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_filter_driver_parent_class)->finalize (object);
 }
 
 static void
-filter_driver_class_init (CamelFilterDriverClass *class)
+camel_filter_driver_class_init (CamelFilterDriverClass *class)
 {
 	GObjectClass *object_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelFilterDriverPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -251,7 +250,7 @@ filter_driver_class_init (CamelFilterDriverClass *class)
 }
 
 static void
-filter_driver_init (CamelFilterDriver *filter_driver)
+camel_filter_driver_init (CamelFilterDriver *filter_driver)
 {
 	gint ii;
 
@@ -286,24 +285,6 @@ filter_driver_init (CamelFilterDriver *filter_driver)
 		g_hash_table_new (g_str_hash, g_str_equal);
 }
 
-GType
-camel_filter_driver_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OBJECT,
-			"CamelFilterDriver",
-			sizeof (CamelFilterDriverClass),
-			(GClassInitFunc) filter_driver_class_init,
-			sizeof (CamelFilterDriver),
-			(GInstanceInitFunc) filter_driver_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_filter_driver_new:
  *
diff --git a/camel/camel-folder-search.c b/camel/camel-folder-search.c
index 05cb046..b936767 100644
--- a/camel/camel-folder-search.c
+++ b/camel/camel-folder-search.c
@@ -96,7 +96,7 @@ static ESExpResult *search_dummy(struct _ESExp *f, gint argc, struct _ESExpResul
 
 static gint read_uid_callback (gpointer  ref, gint ncol, gchar ** cols, gchar **name);
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelFolderSearch, camel_folder_search, CAMEL_TYPE_OBJECT)
 
 static void
 folder_search_dispose (GObject *object)
@@ -109,7 +109,7 @@ folder_search_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_folder_search_parent_class)->dispose (object);
 }
 
 static void
@@ -120,15 +120,14 @@ folder_search_finalize (GObject *object)
 	g_free (search->last_search);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_folder_search_parent_class)->finalize (object);
 }
 
 static void
-folder_search_class_init (CamelFolderSearchClass *class)
+camel_folder_search_class_init (CamelFolderSearchClass *class)
 {
 	GObjectClass *object_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelFolderSearchPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -160,30 +159,12 @@ folder_search_class_init (CamelFolderSearchClass *class)
 }
 
 static void
-folder_search_init (CamelFolderSearch *search)
+camel_folder_search_init (CamelFolderSearch *search)
 {
 	search->priv = CAMEL_FOLDER_SEARCH_GET_PRIVATE (search);
 	search->sexp = e_sexp_new();
 }
 
-GType
-camel_folder_search_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OBJECT,
-			"CamelFolderSearch",
-			sizeof (CamelFolderSearchClass),
-			(GClassInitFunc) folder_search_class_init,
-			sizeof (CamelFolderSearch),
-			(GInstanceInitFunc) folder_search_init,
-			0);
-
-	return type;
-}
-
 static struct {
 	const gchar *name;
 	gint offset;
diff --git a/camel/camel-folder-summary.c b/camel/camel-folder-summary.c
index e173b7b..db3c2d1 100644
--- a/camel/camel-folder-summary.c
+++ b/camel/camel-folder-summary.c
@@ -134,7 +134,7 @@ static CamelMessageContentInfo * summary_build_content_info_message(CamelFolderS
 
 static CamelMessageInfo * message_info_from_uid (CamelFolderSummary *s, const gchar *uid);
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelFolderSummary, camel_folder_summary, CAMEL_TYPE_OBJECT)
 
 static void
 free_o_name(gpointer key, gpointer value, gpointer data)
@@ -191,7 +191,7 @@ folder_summary_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_folder_summary_parent_class)->dispose (object);
 }
 
 static void
@@ -223,7 +223,7 @@ folder_summary_finalize (GObject *object)
 	g_mutex_free(summary->priv->ref_lock);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_folder_summary_parent_class)->finalize (object);
 }
 
 static	gint
@@ -848,11 +848,10 @@ info_set_flags(CamelMessageInfo *info, guint32 flags, guint32 set)
 }
 
 static void
-folder_summary_class_init (CamelFolderSummaryClass *class)
+camel_folder_summary_class_init (CamelFolderSummaryClass *class)
 {
 	GObjectClass *object_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelFolderSummaryPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -911,7 +910,7 @@ folder_summary_class_init (CamelFolderSummaryClass *class)
 }
 
 static void
-folder_summary_init (CamelFolderSummary *summary)
+camel_folder_summary_init (CamelFolderSummary *summary)
 {
 	summary->priv = CAMEL_FOLDER_SUMMARY_GET_PRIVATE (summary);
 
@@ -952,24 +951,6 @@ folder_summary_init (CamelFolderSummary *summary)
 	summary->timeout_handle = 0;
 }
 
-GType
-camel_folder_summary_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OBJECT,
-			"CamelFolderSummary",
-			sizeof (CamelFolderSummaryClass),
-			(GClassInitFunc) folder_summary_class_init,
-			sizeof (CamelFolderSummary),
-			(GInstanceInitFunc) folder_summary_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_folder_summary_new:
  * @folder: parent #CamelFolder object
diff --git a/camel/camel-folder.c b/camel/camel-folder.c
index 9a38cea..35e3318 100644
--- a/camel/camel-folder.c
+++ b/camel/camel-folder.c
@@ -51,8 +51,6 @@
 #define d(x)
 #define w(x)
 
-static gpointer parent_class;
-
 static gboolean refresh_info (CamelFolder *folder, GError **error);
 
 static const gchar *get_name (CamelFolder *folder);
@@ -104,6 +102,8 @@ static gboolean        folder_changed        (CamelObject *object,
 
 static CamelFolderQuotaInfo *get_quota_info  (CamelFolder *folder);
 
+G_DEFINE_ABSTRACT_TYPE (CamelFolder, camel_folder, CAMEL_TYPE_OBJECT)
+
 static void
 folder_dispose (GObject *object)
 {
@@ -123,7 +123,7 @@ folder_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose () method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_folder_parent_class)->dispose (object);
 }
 
 static void
@@ -145,16 +145,15 @@ folder_finalize (GObject *object)
 	g_static_mutex_free (&priv->change_lock);
 
 	/* Chain up to parent's finalize () method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_folder_parent_class)->finalize (object);
 }
 
 static void
-folder_class_init (CamelFolderClass *class)
+camel_folder_class_init (CamelFolderClass *class)
 {
 	GObjectClass *object_class;
 	CamelObjectClass *camel_object_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelFolderPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -206,7 +205,7 @@ folder_class_init (CamelFolderClass *class)
 }
 
 static void
-folder_init (CamelFolder *folder)
+camel_folder_init (CamelFolder *folder)
 {
 	folder->priv = CAMEL_FOLDER_GET_PRIVATE (folder);
 
@@ -217,24 +216,6 @@ folder_init (CamelFolder *folder)
 	g_static_mutex_init (&folder->priv->change_lock);
 }
 
-GType
-camel_folder_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OBJECT,
-			"CamelFolder",
-			sizeof (CamelFolderClass),
-			(GClassInitFunc) folder_class_init,
-			sizeof (CamelFolder),
-			(GInstanceInitFunc) folder_init,
-			0);
-
-	return type;
-}
-
 GQuark
 camel_folder_error_quark (void)
 {
@@ -504,7 +485,7 @@ folder_getv (CamelObject *object,
 		arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE;
 	}
 
-	return CAMEL_OBJECT_CLASS (parent_class)->getv (object, error, args);
+	return CAMEL_OBJECT_CLASS (camel_folder_parent_class)->getv (object, error, args);
 }
 
 static void
@@ -528,7 +509,7 @@ folder_free (CamelObject *o, guint32 tag, gpointer val)
 		g_slist_free (val);
 		break;
 	default:
-		CAMEL_OBJECT_CLASS (parent_class)->free (o, tag, val);
+		CAMEL_OBJECT_CLASS (camel_folder_parent_class)->free (o, tag, val);
 	}
 }
 
diff --git a/camel/camel-gpg-context.c b/camel/camel-gpg-context.c
index 700b4d2..9d0f32f 100644
--- a/camel/camel-gpg-context.c
+++ b/camel/camel-gpg-context.c
@@ -86,7 +86,7 @@ enum {
 	PROP_ALWAYS_TRUST
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelGpgContext, camel_gpg_context, CAMEL_TYPE_CIPHER_CONTEXT)
 
 static const gchar *
 gpg_hash_to_id (CamelCipherContext *context, CamelCipherHash hash)
@@ -2130,12 +2130,11 @@ gpg_context_get_property (GObject *object,
 }
 
 static void
-gpg_context_class_init (CamelGpgContextClass *class)
+camel_gpg_context_class_init (CamelGpgContextClass *class)
 {
 	GObjectClass *object_class;
 	CamelCipherContextClass *cipher_context_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelGpgContextClass));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -2168,29 +2167,11 @@ gpg_context_class_init (CamelGpgContextClass *class)
 }
 
 static void
-gpg_context_init (CamelGpgContext *context)
+camel_gpg_context_init (CamelGpgContext *context)
 {
 	context->priv = CAMEL_GPG_CONTEXT_GET_PRIVATE (context);
 }
 
-GType
-camel_gpg_context_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_CIPHER_CONTEXT,
-			"CamelGpgContext",
-			sizeof (CamelGpgContextClass),
-			(GClassInitFunc) gpg_context_class_init,
-			sizeof (CamelGpgContext),
-			(GInstanceInitFunc) gpg_context_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_gpg_context_new:
  * @session: session
diff --git a/camel/camel-html-parser.c b/camel/camel-html-parser.c
index de6a762..1617792 100644
--- a/camel/camel-html-parser.c
+++ b/camel/camel-html-parser.c
@@ -34,8 +34,6 @@
 /* if defined, must also compile in dump_tag() below somewhere */
 #define d(x)
 
-static gpointer parent_class;
-
 /* Parser definitions, see below object code for details */
 
 struct _CamelHTMLParserPrivate {
@@ -60,6 +58,8 @@ static CamelHTMLParserPrivate *tokenize_init(void);
 static void tokenize_free(CamelHTMLParserPrivate *p);
 static gint tokenize_step(CamelHTMLParserPrivate *p, gchar **datap, gint *lenp);
 
+G_DEFINE_TYPE (CamelHTMLParser, camel_html_parser, CAMEL_TYPE_OBJECT)
+
 /* ********************************************************************** */
 
 static void
@@ -68,15 +68,16 @@ html_parser_finalize (GObject *object)
 	CamelHTMLParser *parser = CAMEL_HTML_PARSER (object);
 
 	tokenize_free (parser->priv);
+
+	/* Chain up to parent's finalize() method. */
+	G_OBJECT_CLASS (camel_html_parser_parent_class)->finalize (object);
 }
 
 static void
-html_parser_class_init (CamelHTMLParserClass *class)
+camel_html_parser_class_init (CamelHTMLParserClass *class)
 {
 	GObjectClass *object_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->finalize = html_parser_finalize;
 
@@ -84,29 +85,11 @@ html_parser_class_init (CamelHTMLParserClass *class)
 }
 
 static void
-html_parser_init (CamelHTMLParser *parser)
+camel_html_parser_init (CamelHTMLParser *parser)
 {
 	parser->priv = tokenize_init();
 }
 
-GType
-camel_html_parser_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OBJECT,
-			"CamelHTMLParser",
-			sizeof (CamelHTMLParserClass),
-			(GClassInitFunc) html_parser_class_init,
-			sizeof (CamelHTMLParser),
-			(GInstanceInitFunc) html_parser_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_html_parser_new:
  *
diff --git a/camel/camel-http-stream.c b/camel/camel-http-stream.c
index 0f3138d..cd156fc 100644
--- a/camel/camel-http-stream.c
+++ b/camel/camel-http-stream.c
@@ -49,7 +49,7 @@
 
 #define d(x)
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelHttpStream, camel_http_stream, CAMEL_TYPE_STREAM)
 
 static CamelStream *
 http_connect (CamelHttpStream *http,
@@ -344,7 +344,7 @@ http_stream_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_http_stream_parent_class)->dispose (object);
 }
 
 static void
@@ -365,7 +365,7 @@ http_stream_finalize (GObject *object)
 	g_free (http->authpass);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_http_stream_parent_class)->finalize (object);
 }
 
 static gssize
@@ -520,13 +520,11 @@ http_stream_reset (CamelStream *stream,
 }
 
 static void
-http_stream_class_init (CamelHttpStreamClass *class)
+camel_http_stream_class_init (CamelHttpStreamClass *class)
 {
 	GObjectClass *object_class;
 	CamelStreamClass *stream_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->dispose = http_stream_dispose;
 	object_class->finalize = http_stream_finalize;
@@ -540,29 +538,11 @@ http_stream_class_init (CamelHttpStreamClass *class)
 }
 
 static void
-http_stream_init (CamelHttpStream *http)
+camel_http_stream_init (CamelHttpStream *http)
 {
 	http->raw_headers = g_queue_new ();
 }
 
-GType
-camel_http_stream_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_STREAM,
-			"CamelHttpStream",
-			sizeof (CamelHttpStreamClass),
-			(GClassInitFunc) http_stream_class_init,
-			sizeof (CamelHttpStream),
-			(GInstanceInitFunc) http_stream_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_http_stream_new:
  * @method: HTTP method
diff --git a/camel/camel-index.c b/camel/camel-index.c
index dc345c3..092b5b5 100644
--- a/camel/camel-index.c
+++ b/camel/camel-index.c
@@ -53,7 +53,7 @@ struct _CamelIndexPrivate {
 /* CamelIndex */
 /* ********************************************************************** */
 
-static gpointer index_parent_class;
+G_DEFINE_TYPE (CamelIndex, camel_index, CAMEL_TYPE_OBJECT)
 
 static void
 index_finalize (GObject *object)
@@ -63,15 +63,14 @@ index_finalize (GObject *object)
 	g_free (index->path);
 
 	/* Chain up to parent's finalize () method. */
-	G_OBJECT_CLASS (index_parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_index_parent_class)->finalize (object);
 }
 
 static void
-index_class_init (CamelIndexClass *class)
+camel_index_class_init (CamelIndexClass *class)
 {
 	GObjectClass *object_class;
 
-	index_parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelIndexPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -79,30 +78,12 @@ index_class_init (CamelIndexClass *class)
 }
 
 static void
-index_init (CamelIndex *index)
+camel_index_init (CamelIndex *index)
 {
 	index->priv = CAMEL_INDEX_GET_PRIVATE (index);
 	index->version = CAMEL_INDEX_VERSION;
 }
 
-GType
-camel_index_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OBJECT,
-			"CamelIndex",
-			sizeof (CamelIndexClass),
-			(GClassInitFunc) index_class_init,
-			sizeof (CamelIndex),
-			(GInstanceInitFunc) index_init,
-			0);
-
-	return type;
-}
-
 CamelIndex *
 camel_index_new (const gchar *path, gint flags)
 {
@@ -355,7 +336,7 @@ camel_index_names (CamelIndex *idx)
 /* CamelIndexName */
 /* ********************************************************************** */
 
-static gpointer index_name_parent_class;
+G_DEFINE_TYPE (CamelIndexName, camel_index_name, CAMEL_TYPE_OBJECT)
 
 static void
 index_name_dispose (GObject *object)
@@ -368,36 +349,21 @@ index_name_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose () method. */
-	G_OBJECT_CLASS (index_name_parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_index_name_parent_class)->dispose (object);
 }
 
 static void
-index_name_class_init (CamelIndexNameClass *class)
+camel_index_name_class_init (CamelIndexNameClass *class)
 {
 	GObjectClass *object_class;
 
-	index_name_parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->dispose = index_name_dispose;
 }
 
-GType
-camel_index_name_get_type (void)
+static void
+camel_index_name_init (CamelIndexName *index_name)
 {
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OBJECT,
-			"CamelIndexName",
-			sizeof (CamelIndexNameClass),
-			(GClassInitFunc) index_name_class_init,
-			sizeof (CamelIndexName),
-			(GInstanceInitFunc) NULL,
-			0);
-
-	return type;
 }
 
 CamelIndexName *
@@ -451,7 +417,7 @@ camel_index_name_add_buffer (CamelIndexName *idn,
 /* CamelIndexCursor */
 /* ********************************************************************** */
 
-static gpointer index_cursor_parent_class;
+G_DEFINE_TYPE (CamelIndexCursor, camel_index_cursor, CAMEL_TYPE_OBJECT)
 
 static void
 index_cursor_dispose (GObject *object)
@@ -464,36 +430,21 @@ index_cursor_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose () method. */
-	G_OBJECT_CLASS (index_cursor_parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_index_cursor_parent_class)->dispose (object);
 }
 
 static void
-index_cursor_class_init (CamelIndexCursorClass *class)
+camel_index_cursor_class_init (CamelIndexCursorClass *class)
 {
 	GObjectClass *object_class;
 
-	index_cursor_parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->dispose = index_cursor_dispose;
 }
 
-GType
-camel_index_cursor_get_type (void)
+static void
+camel_index_cursor_init (CamelIndexCursor *index_cursor)
 {
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OBJECT,
-			"CamelIndexCursor",
-			sizeof (CamelIndexCursorClass),
-			(GClassInitFunc) index_cursor_class_init,
-			sizeof (CamelIndexCursor),
-			(GInstanceInitFunc) NULL,
-			0);
-
-	return type;
 }
 
 CamelIndexCursor *
diff --git a/camel/camel-internet-address.c b/camel/camel-internet-address.c
index 68d10ee..001cf04 100644
--- a/camel/camel-internet-address.c
+++ b/camel/camel-internet-address.c
@@ -31,7 +31,7 @@ struct _address {
 	gchar *address;
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelInternetAddress, camel_internet_address, CAMEL_TYPE_ADDRESS)
 
 static gint
 internet_address_decode (CamelAddress *a, const gchar *raw)
@@ -221,12 +221,10 @@ internet_address_cat (CamelAddress *dest, CamelAddress *source)
 }
 
 static void
-internet_address_class_init (CamelInternetAddressClass *class)
+camel_internet_address_class_init (CamelInternetAddressClass *class)
 {
 	CamelAddressClass *address_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	address_class = CAMEL_ADDRESS_CLASS (class);
 	address_class->decode = internet_address_decode;
 	address_class->encode = internet_address_encode;
@@ -236,22 +234,9 @@ internet_address_class_init (CamelInternetAddressClass *class)
 	address_class->cat = internet_address_cat;
 }
 
-GType
-camel_internet_address_get_type(void)
+static void
+camel_internet_address_init (CamelInternetAddress *internet_address)
 {
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_ADDRESS,
-			"CamelInternetAddress",
-			sizeof (CamelInternetAddressClass),
-			(GClassInitFunc) internet_address_class_init,
-			sizeof (CamelInternetAddress),
-			(GInstanceInitFunc) NULL,
-			0);
-
-	return type;
 }
 
 /**
diff --git a/camel/camel-medium.c b/camel/camel-medium.c
index 5558c33..81c6d8c 100644
--- a/camel/camel-medium.c
+++ b/camel/camel-medium.c
@@ -37,8 +37,6 @@
 	(G_TYPE_INSTANCE_GET_PRIVATE \
 	((obj), CAMEL_TYPE_MEDIUM, CamelMediumPrivate))
 
-static gpointer parent_class;
-
 struct _CamelMediumPrivate {
 	/* The content of the medium, as opposed to our parent
 	 * CamelDataWrapper, which wraps both the headers and
@@ -51,6 +49,8 @@ enum {
 	PROP_CONTENT
 };
 
+G_DEFINE_ABSTRACT_TYPE (CamelMedium, camel_medium, CAMEL_TYPE_DATA_WRAPPER)
+
 static void
 medium_set_property (GObject *object,
                      guint property_id,
@@ -98,7 +98,7 @@ medium_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_medium_parent_class)->dispose (object);
 }
 
 static gboolean
@@ -134,12 +134,11 @@ medium_get_content (CamelMedium *medium)
 }
 
 static void
-medium_class_init (CamelMediumClass *class)
+camel_medium_class_init (CamelMediumClass *class)
 {
 	GObjectClass *object_class;
 	CamelDataWrapperClass *data_wrapper_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelMediumPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -165,29 +164,11 @@ medium_class_init (CamelMediumClass *class)
 }
 
 static void
-medium_init (CamelMedium *medium)
+camel_medium_init (CamelMedium *medium)
 {
 	medium->priv = CAMEL_MEDIUM_GET_PRIVATE (medium);
 }
 
-GType
-camel_medium_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_DATA_WRAPPER,
-			"CamelMedium",
-			sizeof (CamelMediumClass),
-			(GClassInitFunc) medium_class_init,
-			sizeof (CamelMedium),
-			(GInstanceInitFunc) medium_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_medium_add_header:
  * @medium: a #CamelMedium object
diff --git a/camel/camel-mime-filter-basic.c b/camel/camel-mime-filter-basic.c
index b84a10b..2af2c18 100644
--- a/camel/camel-mime-filter-basic.c
+++ b/camel/camel-mime-filter-basic.c
@@ -35,7 +35,7 @@ struct _CamelMimeFilterBasicPrivate {
 	gint save;
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelMimeFilterBasic, camel_mime_filter_basic, CAMEL_TYPE_MIME_FILTER)
 
 /* here we do all of the basic mime filtering */
 static void
@@ -234,11 +234,10 @@ mime_filter_basic_reset (CamelMimeFilter *mime_filter)
 }
 
 static void
-mime_filter_basic_class_init (CamelMimeFilterBasicClass *class)
+camel_mime_filter_basic_class_init (CamelMimeFilterBasicClass *class)
 {
 	CamelMimeFilterClass *mime_filter_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelMimeFilterBasicPrivate));
 
 	mime_filter_class = CAMEL_MIME_FILTER_CLASS (class);
@@ -248,29 +247,11 @@ mime_filter_basic_class_init (CamelMimeFilterBasicClass *class)
 }
 
 static void
-mime_filter_basic_init (CamelMimeFilterBasic *filter)
+camel_mime_filter_basic_init (CamelMimeFilterBasic *filter)
 {
 	filter->priv = CAMEL_MIME_FILTER_BASIC_GET_PRIVATE (filter);
 }
 
-GType
-camel_mime_filter_basic_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_MIME_FILTER,
-			"CamelMimeFilterBasic",
-			sizeof (CamelMimeFilterBasicClass),
-			(GClassInitFunc) mime_filter_basic_class_init,
-			sizeof (CamelMimeFilterBasic),
-			(GInstanceInitFunc) mime_filter_basic_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_mime_filter_basic_new_type:
  * @type: a #CamelMimeFilterBasicType type
diff --git a/camel/camel-mime-filter-bestenc.c b/camel/camel-mime-filter-bestenc.c
index 7fe9673..bbc505c 100644
--- a/camel/camel-mime-filter-bestenc.c
+++ b/camel/camel-mime-filter-bestenc.c
@@ -54,7 +54,7 @@ struct _CamelMimeFilterBestencPrivate {
 	CamelCharset charset;	/* used to determine the best charset to use */
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelMimeFilterBestenc, camel_mime_filter_bestenc, CAMEL_TYPE_MIME_FILTER)
 
 static void
 mime_filter_bestenc_filter (CamelMimeFilter *mime_filter,
@@ -200,11 +200,10 @@ mime_filter_bestenc_reset (CamelMimeFilter *mime_filter)
 }
 
 static void
-mime_filter_bestenc_class_init (CamelMimeFilterBestencClass *class)
+camel_mime_filter_bestenc_class_init (CamelMimeFilterBestencClass *class)
 {
 	CamelMimeFilterClass *mime_filter_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelMimeFilterBestencPrivate));
 
 	mime_filter_class = CAMEL_MIME_FILTER_CLASS (class);
@@ -214,31 +213,13 @@ mime_filter_bestenc_class_init (CamelMimeFilterBestencClass *class)
 }
 
 static void
-mime_filter_bestenc_init (CamelMimeFilterBestenc *filter)
+camel_mime_filter_bestenc_init (CamelMimeFilterBestenc *filter)
 {
 	filter->priv = CAMEL_MIME_FILTER_BESTENC_GET_PRIVATE (filter);
 
 	mime_filter_bestenc_reset (CAMEL_MIME_FILTER (filter));
 }
 
-GType
-camel_mime_filter_bestenc_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_MIME_FILTER,
-			"CamelMimeFilterBestenc",
-			sizeof (CamelMimeFilterBestencClass),
-			(GClassInitFunc) mime_filter_bestenc_class_init,
-			sizeof (CamelMimeFilterBestenc),
-			(GInstanceInitFunc) mime_filter_bestenc_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_mime_filter_bestenc_new:
  * @flags: a bitmask of data required.
diff --git a/camel/camel-mime-filter-canon.c b/camel/camel-mime-filter-canon.c
index 7894b5f..b272a6c 100644
--- a/camel/camel-mime-filter-canon.c
+++ b/camel/camel-mime-filter-canon.c
@@ -39,7 +39,7 @@ struct _CamelMimeFilterCanonPrivate {
 	guint32 flags;
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelMimeFilterCanon, camel_mime_filter_canon, CAMEL_TYPE_MIME_FILTER)
 
 static void
 mime_filter_canon_run (CamelMimeFilter *mime_filter,
@@ -178,11 +178,10 @@ mime_filter_canon_reset (CamelMimeFilter *mime_filter)
 }
 
 static void
-mime_filter_canon_class_init (CamelMimeFilterCanonClass *class)
+camel_mime_filter_canon_class_init (CamelMimeFilterCanonClass *class)
 {
 	CamelMimeFilterClass *mime_filter_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelMimeFilterCanonPrivate));
 
 	mime_filter_class = CAMEL_MIME_FILTER_CLASS (class);
@@ -192,28 +191,11 @@ mime_filter_canon_class_init (CamelMimeFilterCanonClass *class)
 }
 
 static void
-mime_filter_canon_init (CamelMimeFilterCanon *filter)
+camel_mime_filter_canon_init (CamelMimeFilterCanon *filter)
 {
 	filter->priv = CAMEL_MIME_FILTER_CANON_GET_PRIVATE (filter);
 }
 
-GType
-camel_mime_filter_canon_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_MIME_FILTER, "CamelMimeFilterCanon",
-			sizeof (CamelMimeFilterCanonClass),
-			(GClassInitFunc) mime_filter_canon_class_init,
-			sizeof (CamelMimeFilterCanon),
-			(GInstanceInitFunc) mime_filter_canon_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_mime_filter_canon_new:
  * @flags: bitwise flags defining the behaviour of the filter
diff --git a/camel/camel-mime-filter-charset.c b/camel/camel-mime-filter-charset.c
index 92a6c5b..a553c6c 100644
--- a/camel/camel-mime-filter-charset.c
+++ b/camel/camel-mime-filter-charset.c
@@ -43,7 +43,7 @@ struct _CamelMimeFilterCharsetPrivate {
 	gchar *to;
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelMimeFilterCharset, camel_mime_filter_charset, CAMEL_TYPE_MIME_FILTER)
 
 static void
 mime_filter_charset_finalize (GObject *object)
@@ -61,7 +61,7 @@ mime_filter_charset_finalize (GObject *object)
 	}
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_mime_filter_charset_parent_class)->finalize (object);
 }
 
 static void
@@ -234,12 +234,11 @@ mime_filter_charset_reset (CamelMimeFilter *mime_filter)
 }
 
 static void
-mime_filter_charset_class_init (CamelMimeFilterCharsetClass *class)
+camel_mime_filter_charset_class_init (CamelMimeFilterCharsetClass *class)
 {
 	GObjectClass *object_class;
 	CamelMimeFilterClass *mime_filter_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelMimeFilterCharsetPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -252,30 +251,12 @@ mime_filter_charset_class_init (CamelMimeFilterCharsetClass *class)
 }
 
 static void
-mime_filter_charset_init (CamelMimeFilterCharset *filter)
+camel_mime_filter_charset_init (CamelMimeFilterCharset *filter)
 {
 	filter->priv = CAMEL_MIME_FILTER_CHARSET_GET_PRIVATE (filter);
 	filter->priv->ic = (iconv_t) -1;
 }
 
-GType
-camel_mime_filter_charset_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_MIME_FILTER,
-			"CamelMimeFilterCharset",
-			sizeof (CamelMimeFilterCharsetClass),
-			(GClassInitFunc) mime_filter_charset_class_init,
-			sizeof (CamelMimeFilterCharset),
-			(GInstanceInitFunc) mime_filter_charset_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_mime_filter_charset_new:
  * @from_charset: charset to convert from
diff --git a/camel/camel-mime-filter-crlf.c b/camel/camel-mime-filter-crlf.c
index 48056ea..a233dcb 100644
--- a/camel/camel-mime-filter-crlf.c
+++ b/camel/camel-mime-filter-crlf.c
@@ -34,7 +34,7 @@ struct _CamelMimeFilterCRLFPrivate {
 	gboolean saw_dot;
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelMimeFilterCRLF, camel_mime_filter_crlf, CAMEL_TYPE_MIME_FILTER)
 
 static void
 mime_filter_crlf_filter (CamelMimeFilter *mime_filter,
@@ -155,11 +155,10 @@ mime_filter_crlf_reset (CamelMimeFilter *mime_filter)
 }
 
 static void
-mime_filter_crlf_class_init (CamelMimeFilterCRLFClass *class)
+camel_mime_filter_crlf_class_init (CamelMimeFilterCRLFClass *class)
 {
 	CamelMimeFilterClass *mime_filter_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelMimeFilterCRLFPrivate));
 
 	mime_filter_class = CAMEL_MIME_FILTER_CLASS (class);
@@ -169,7 +168,7 @@ mime_filter_crlf_class_init (CamelMimeFilterCRLFClass *class)
 }
 
 static void
-mime_filter_crlf_init (CamelMimeFilterCRLF *filter)
+camel_mime_filter_crlf_init (CamelMimeFilterCRLF *filter)
 {
 	filter->priv = CAMEL_MIME_FILTER_CRLF_GET_PRIVATE (filter);
 
@@ -178,24 +177,6 @@ mime_filter_crlf_init (CamelMimeFilterCRLF *filter)
 	filter->priv->saw_dot = FALSE;
 }
 
-GType
-camel_mime_filter_crlf_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_MIME_FILTER,
-			"CamelMimeFilterCRLF",
-			sizeof (CamelMimeFilterCRLFClass),
-			(GClassInitFunc) mime_filter_crlf_class_init,
-			sizeof (CamelMimeFilterCRLF),
-			(GInstanceInitFunc) mime_filter_crlf_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_mime_filter_crlf_new:
  * @direction: encode vs decode
diff --git a/camel/camel-mime-filter-enriched.c b/camel/camel-mime-filter-enriched.c
index 44ab318..e1cfbe2 100644
--- a/camel/camel-mime-filter-enriched.c
+++ b/camel/camel-mime-filter-enriched.c
@@ -99,7 +99,7 @@ static struct {
 
 static GHashTable *enriched_hash = NULL;
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelMimeFilterEnriched, camel_mime_filter_enriched, CAMEL_TYPE_MIME_FILTER)
 
 #if 0
 static gboolean
@@ -523,12 +523,11 @@ mime_filter_enriched_reset (CamelMimeFilter *filter)
 }
 
 static void
-mime_filter_enriched_class_init (CamelMimeFilterEnrichedClass *class)
+camel_mime_filter_enriched_class_init (CamelMimeFilterEnrichedClass *class)
 {
 	CamelMimeFilterClass *mime_filter_class;
 	gint i;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelMimeFilterEnrichedPrivate));
 
 	mime_filter_class = CAMEL_MIME_FILTER_CLASS (class);
@@ -546,29 +545,11 @@ mime_filter_enriched_class_init (CamelMimeFilterEnrichedClass *class)
 }
 
 static void
-mime_filter_enriched_init (CamelMimeFilterEnriched *filter)
+camel_mime_filter_enriched_init (CamelMimeFilterEnriched *filter)
 {
 	filter->priv = CAMEL_MIME_FILTER_ENRICHED_GET_PRIVATE (filter);
 }
 
-GType
-camel_mime_filter_enriched_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_MIME_FILTER,
-			"CamelMimeFilterEnriched",
-			sizeof (CamelMimeFilterEnrichedClass),
-			(GClassInitFunc) mime_filter_enriched_class_init,
-			sizeof (CamelMimeFilterEnriched),
-			(GInstanceInitFunc) mime_filter_enriched_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_mime_filter_enriched_new:
  * @flags: bitwise set of flags to specify filter behaviour
diff --git a/camel/camel-mime-filter-from.c b/camel/camel-mime-filter-from.c
index a574555..4d91dc6 100644
--- a/camel/camel-mime-filter-from.c
+++ b/camel/camel-mime-filter-from.c
@@ -37,13 +37,13 @@ struct _CamelMimeFilterFromPrivate {
 	gint midline;		/* are we between lines? */
 };
 
-static gpointer parent_class;
-
 struct fromnode {
 	struct fromnode *next;
 	const gchar *pointer;
 };
 
+G_DEFINE_TYPE (CamelMimeFilterFrom, camel_mime_filter_from, CAMEL_TYPE_MIME_FILTER)
+
 static void
 mime_filter_from_complete (CamelMimeFilter *mime_filter,
                            const gchar *in,
@@ -150,11 +150,10 @@ mime_filter_from_filter (CamelMimeFilter *mime_filter,
 }
 
 static void
-mime_filter_from_class_init (CamelMimeFilterFromClass *class)
+camel_mime_filter_from_class_init (CamelMimeFilterFromClass *class)
 {
 	CamelMimeFilterClass *mime_filter_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelMimeFilterFromPrivate));
 
 	mime_filter_class = CAMEL_MIME_FILTER_CLASS (class);
@@ -163,29 +162,11 @@ mime_filter_from_class_init (CamelMimeFilterFromClass *class)
 }
 
 static void
-mime_filter_from_init (CamelMimeFilterFrom *filter)
+camel_mime_filter_from_init (CamelMimeFilterFrom *filter)
 {
 	filter->priv = CAMEL_MIME_FILTER_FROM_GET_PRIVATE (filter);
 }
 
-GType
-camel_mime_filter_from_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_MIME_FILTER,
-			"CamelMimeFilterFrom",
-			sizeof (CamelMimeFilterFromClass),
-			(GClassInitFunc) mime_filter_from_class_init,
-			sizeof (CamelMimeFilterFrom),
-			(GInstanceInitFunc) mime_filter_from_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_mime_filter_from_new:
  *
diff --git a/camel/camel-mime-filter-gzip.c b/camel/camel-mime-filter-gzip.c
index 005314d..01a5a5e 100644
--- a/camel/camel-mime-filter-gzip.c
+++ b/camel/camel-mime-filter-gzip.c
@@ -95,7 +95,7 @@ struct _CamelMimeFilterGZipPrivate {
 	guint32 isize;
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelMimeFilterGZip, camel_mime_filter_gzip, CAMEL_TYPE_MIME_FILTER)
 
 static void
 gzip_filter (CamelMimeFilter *filter,
@@ -414,16 +414,15 @@ mime_filter_gzip_finalize (GObject *object)
 	g_free (priv->stream);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_mime_filter_gzip_parent_class)->finalize (object);
 }
 
 static void
-mime_filter_gzip_class_init (CamelMimeFilterGZipClass *class)
+camel_mime_filter_gzip_class_init (CamelMimeFilterGZipClass *class)
 {
 	GObjectClass *object_class;
 	CamelMimeFilterClass *mime_filter_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelMimeFilterGZipPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -436,31 +435,13 @@ mime_filter_gzip_class_init (CamelMimeFilterGZipClass *class)
 }
 
 static void
-mime_filter_gzip_init (CamelMimeFilterGZip *filter)
+camel_mime_filter_gzip_init (CamelMimeFilterGZip *filter)
 {
 	filter->priv = CAMEL_MIME_FILTER_GZIP_GET_PRIVATE (filter);
 	filter->priv->stream = g_new0 (z_stream, 1);
 	filter->priv->crc32 = crc32 (0, Z_NULL, 0);
 }
 
-GType
-camel_mime_filter_gzip_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_MIME_FILTER,
-			"CamelMimeFilterGZip",
-			sizeof (CamelMimeFilterGZipClass),
-			(GClassInitFunc) mime_filter_gzip_class_init,
-			sizeof (CamelMimeFilterGZip),
-			(GInstanceInitFunc) mime_filter_gzip_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_mime_filter_gzip_new:
  * @mode: zip or unzip
diff --git a/camel/camel-mime-filter-html.c b/camel/camel-mime-filter-html.c
index 7d49d38..1a96834 100644
--- a/camel/camel-mime-filter-html.c
+++ b/camel/camel-mime-filter-html.c
@@ -41,7 +41,7 @@ struct _CamelMimeFilterHTMLPrivate {
 	CamelHTMLParser *ctxt;
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelMimeFilterHTML, camel_mime_filter_html, CAMEL_TYPE_MIME_FILTER)
 
 /* ********************************************************************** */
 
@@ -123,7 +123,7 @@ mime_filter_html_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_mime_filter_html_parent_class)->dispose (object);
 }
 
 static void
@@ -166,12 +166,11 @@ mime_filter_html_complete (CamelMimeFilter *mime_filter,
 }
 
 static void
-mime_filter_html_class_init (CamelMimeFilterHTMLClass *class)
+camel_mime_filter_html_class_init (CamelMimeFilterHTMLClass *class)
 {
 	GObjectClass *object_class;
 	CamelMimeFilterClass *mime_filter_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelMimeFilterHTMLPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -184,30 +183,12 @@ mime_filter_html_class_init (CamelMimeFilterHTMLClass *class)
 }
 
 static void
-mime_filter_html_init (CamelMimeFilterHTML *filter)
+camel_mime_filter_html_init (CamelMimeFilterHTML *filter)
 {
 	filter->priv = CAMEL_MIME_FILTER_HTML_GET_PRIVATE (filter);
 	filter->priv->ctxt = camel_html_parser_new ();
 }
 
-GType
-camel_mime_filter_html_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_MIME_FILTER,
-			"CamelMimeFilterHTML",
-			sizeof (CamelMimeFilterHTMLClass),
-			(GClassInitFunc) mime_filter_html_class_init,
-			sizeof (CamelMimeFilterHTML),
-			(GInstanceInitFunc) mime_filter_html_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_mime_filter_html_new:
  *
diff --git a/camel/camel-mime-filter-index.c b/camel/camel-mime-filter-index.c
index 0c6e3a5..47c15dd 100644
--- a/camel/camel-mime-filter-index.c
+++ b/camel/camel-mime-filter-index.c
@@ -30,7 +30,7 @@ struct _CamelMimeFilterIndexPrivate {
 	CamelIndexName *name;
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelMimeFilterIndex, camel_mime_filter_index, CAMEL_TYPE_MIME_FILTER)
 
 static void
 mime_filter_index_dispose (GObject *object)
@@ -50,7 +50,7 @@ mime_filter_index_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_mime_filter_index_parent_class)->dispose (object);
 }
 
 static void
@@ -105,12 +105,11 @@ donothing:
 }
 
 static void
-mime_filter_index_class_init (CamelMimeFilterIndexClass *class)
+camel_mime_filter_index_class_init (CamelMimeFilterIndexClass *class)
 {
 	GObjectClass *object_class;
 	CamelMimeFilterClass *mime_filter_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelMimeFilterIndexPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -122,29 +121,11 @@ mime_filter_index_class_init (CamelMimeFilterIndexClass *class)
 }
 
 static void
-mime_filter_index_init (CamelMimeFilterIndex *filter)
+camel_mime_filter_index_init (CamelMimeFilterIndex *filter)
 {
 	filter->priv = CAMEL_MIME_FILTER_INDEX_GET_PRIVATE (filter);
 }
 
-GType
-camel_mime_filter_index_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_MIME_FILTER,
-			"CamelMimeFilterIndex",
-			sizeof (CamelMimeFilterIndexClass),
-			(GClassInitFunc) mime_filter_index_class_init,
-			sizeof (CamelMimeFilterIndex),
-			(GInstanceInitFunc) mime_filter_index_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_mime_filter_index_new:
  * @index: a #CamelIndex object
diff --git a/camel/camel-mime-filter-linewrap.c b/camel/camel-mime-filter-linewrap.c
index 2bd2d9e..0449d89 100644
--- a/camel/camel-mime-filter-linewrap.c
+++ b/camel/camel-mime-filter-linewrap.c
@@ -39,7 +39,7 @@ struct _CamelMimeFilterLinewrapPrivate {
 	guint32 flags;
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelMimeFilterLinewrap, camel_mime_filter_linewrap, CAMEL_TYPE_MIME_FILTER)
 
 static void
 mime_filter_linewrap_filter (CamelMimeFilter *mime_filter,
@@ -164,11 +164,10 @@ mime_filter_linewrap_reset (CamelMimeFilter *mime_filter)
 }
 
 static void
-mime_filter_linewrap_class_init (CamelMimeFilterLinewrapClass *class)
+camel_mime_filter_linewrap_class_init (CamelMimeFilterLinewrapClass *class)
 {
 	CamelMimeFilterClass *mime_filter_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelMimeFilterLinewrapPrivate));
 
 	mime_filter_class = CAMEL_MIME_FILTER_CLASS (class);
@@ -178,29 +177,11 @@ mime_filter_linewrap_class_init (CamelMimeFilterLinewrapClass *class)
 }
 
 static void
-mime_filter_linewrap_init (CamelMimeFilterLinewrap *filter)
+camel_mime_filter_linewrap_init (CamelMimeFilterLinewrap *filter)
 {
 	filter->priv = CAMEL_MIME_FILTER_LINEWRAP_GET_PRIVATE (filter);
 }
 
-GType
-camel_mime_filter_linewrap_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_MIME_FILTER,
-			"CamelMimeFilterLinewrap",
-			sizeof (CamelMimeFilterLinewrapClass),
-			(GClassInitFunc) mime_filter_linewrap_class_init,
-			sizeof (CamelMimeFilterLinewrap),
-			(GInstanceInitFunc) mime_filter_linewrap_init,
-			0);
-
-	return type;
-}
-
 CamelMimeFilter *
 camel_mime_filter_linewrap_new (guint preferred_len,
                                 guint max_len,
diff --git a/camel/camel-mime-filter-pgp.c b/camel/camel-mime-filter-pgp.c
index d91f4a2..c9a539a 100644
--- a/camel/camel-mime-filter-pgp.c
+++ b/camel/camel-mime-filter-pgp.c
@@ -55,7 +55,7 @@ enum {
 	PGP_FOOTER
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelMimeFilterPgp, camel_mime_filter_pgp, CAMEL_TYPE_MIME_FILTER)
 
 static void
 mime_filter_pgp_run (CamelMimeFilter *mime_filter,
@@ -189,11 +189,10 @@ mime_filter_pgp_reset (CamelMimeFilter *mime_filter)
 }
 
 static void
-mime_filter_pgp_class_init (CamelMimeFilterPgpClass *class)
+camel_mime_filter_pgp_class_init (CamelMimeFilterPgpClass *class)
 {
 	CamelMimeFilterClass *mime_filter_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelMimeFilterPgpPrivate));
 
 	mime_filter_class = CAMEL_MIME_FILTER_CLASS (class);
@@ -203,29 +202,11 @@ mime_filter_pgp_class_init (CamelMimeFilterPgpClass *class)
 }
 
 static void
-mime_filter_pgp_init (CamelMimeFilterPgp *filter)
+camel_mime_filter_pgp_init (CamelMimeFilterPgp *filter)
 {
 	filter->priv = CAMEL_MIME_FILTER_PGP_GET_PRIVATE (filter);
 }
 
-GType
-camel_mime_filter_pgp_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_MIME_FILTER,
-			"CamelMimeFilterPgp",
-			sizeof (CamelMimeFilterPgpClass),
-			(GClassInitFunc) mime_filter_pgp_class_init,
-			sizeof (CamelMimeFilterPgp),
-			(GInstanceInitFunc) mime_filter_pgp_init,
-			0);
-
-	return type;
-}
-
 CamelMimeFilter *
 camel_mime_filter_pgp_new (void)
 {
diff --git a/camel/camel-mime-filter-progress.c b/camel/camel-mime-filter-progress.c
index 965618a..696bc14 100644
--- a/camel/camel-mime-filter-progress.c
+++ b/camel/camel-mime-filter-progress.c
@@ -42,7 +42,7 @@ struct _CamelMimeFilterProgressPrivate {
 	gsize count;
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelMimeFilterProgress, camel_mime_filter_progress, CAMEL_TYPE_MIME_FILTER)
 
 static void
 mime_filter_progress_filter (CamelMimeFilter *filter,
@@ -95,11 +95,10 @@ mime_filter_progress_reset (CamelMimeFilter *mime_filter)
 }
 
 static void
-mime_filter_progress_class_init (CamelMimeFilterProgressClass *class)
+camel_mime_filter_progress_class_init (CamelMimeFilterProgressClass *class)
 {
 	CamelMimeFilterClass *mime_filter_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelMimeFilterProgressPrivate));
 
 	mime_filter_class = CAMEL_MIME_FILTER_CLASS (class);
@@ -109,29 +108,11 @@ mime_filter_progress_class_init (CamelMimeFilterProgressClass *class)
 }
 
 static void
-mime_filter_progress_init (CamelMimeFilterProgress *filter)
+camel_mime_filter_progress_init (CamelMimeFilterProgress *filter)
 {
 	filter->priv = CAMEL_MIME_FILTER_PROGRESS_GET_PRIVATE (filter);
 }
 
-GType
-camel_mime_filter_progress_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_MIME_FILTER,
-			"CamelMimeFilterProgress",
-			sizeof (CamelMimeFilterProgressClass),
-			(GClassInitFunc) mime_filter_progress_class_init,
-			sizeof (CamelMimeFilterProgress),
-			(GInstanceInitFunc) mime_filter_progress_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_mime_filter_progress_new:
  * @operation: a #CamelOperation
diff --git a/camel/camel-mime-filter-save.c b/camel/camel-mime-filter-save.c
index 1b98b89..7c30913 100644
--- a/camel/camel-mime-filter-save.c
+++ b/camel/camel-mime-filter-save.c
@@ -35,7 +35,7 @@ struct _CamelMimeFilterSavePrivate {
 	CamelStream *stream;
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelMimeFilterSave, camel_mime_filter_save, CAMEL_TYPE_MIME_FILTER)
 
 static void
 mime_filter_save_filter (CamelMimeFilter *mime_filter,
@@ -74,11 +74,10 @@ mime_filter_save_complete (CamelMimeFilter *mime_filter,
 }
 
 static void
-mime_filter_save_class_init (CamelMimeFilterSaveClass *class)
+camel_mime_filter_save_class_init (CamelMimeFilterSaveClass *class)
 {
 	CamelMimeFilterClass *mime_filter_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelMimeFilterSavePrivate));
 
 	mime_filter_class = CAMEL_MIME_FILTER_CLASS (class);
@@ -87,29 +86,11 @@ mime_filter_save_class_init (CamelMimeFilterSaveClass *class)
 }
 
 static void
-mime_filter_save_init (CamelMimeFilterSave *filter)
+camel_mime_filter_save_init (CamelMimeFilterSave *filter)
 {
 	filter->priv = CAMEL_MIME_FILTER_SAVE_GET_PRIVATE (filter);
 }
 
-GType
-camel_mime_filter_save_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_MIME_FILTER,
-			"CamelMimeFilterSave",
-			sizeof (CamelMimeFilterSaveClass),
-			(GClassInitFunc) mime_filter_save_class_init,
-			sizeof (CamelMimeFilterSave),
-			(GInstanceInitFunc) mime_filter_save_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_mime_filter_save_new:
  * @stream: a #CamelStream object
diff --git a/camel/camel-mime-filter-tohtml.c b/camel/camel-mime-filter-tohtml.c
index 0b06614..bf96d04 100644
--- a/camel/camel-mime-filter-tohtml.c
+++ b/camel/camel-mime-filter-tohtml.c
@@ -83,7 +83,7 @@ static struct {
 	{ CONVERT_ADDRSPEC, { "@",         "mailto:";, camel_url_addrspec_start, camel_url_addrspec_end } },
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelMimeFilterToHTML, camel_mime_filter_tohtml, CAMEL_TYPE_MIME_FILTER)
 
 static gchar *
 check_size (CamelMimeFilter *mime_filter,
@@ -402,7 +402,7 @@ mime_filter_tohtml_finalize (GObject *object)
 	camel_url_scanner_free (priv->scanner);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_mime_filter_tohtml_parent_class)->finalize (object);
 }
 
 static void
@@ -445,12 +445,11 @@ mime_filter_tohtml_reset (CamelMimeFilter *mime_filter)
 }
 
 static void
-mime_filter_tohtml_class_init (CamelMimeFilterToHTMLClass *class)
+camel_mime_filter_tohtml_class_init (CamelMimeFilterToHTMLClass *class)
 {
 	GObjectClass *object_class;
 	CamelMimeFilterClass *filter_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelMimeFilterToHTMLPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -463,31 +462,13 @@ mime_filter_tohtml_class_init (CamelMimeFilterToHTMLClass *class)
 }
 
 static void
-mime_filter_tohtml_init (CamelMimeFilterToHTML *filter)
+camel_mime_filter_tohtml_init (CamelMimeFilterToHTML *filter)
 {
 	filter->priv = CAMEL_MIME_FILTER_TOHTML_GET_PRIVATE (filter);
 
 	filter->priv->scanner = camel_url_scanner_new ();
 }
 
-GType
-camel_mime_filter_tohtml_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_MIME_FILTER,
-			"CamelMimeFilterToHTML",
-			sizeof (CamelMimeFilterToHTMLClass),
-			(GClassInitFunc) mime_filter_tohtml_class_init,
-			sizeof (CamelMimeFilterToHTML),
-			(GInstanceInitFunc) mime_filter_tohtml_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_mime_filter_tohtml_new:
  * @flags: bitwise flags defining the behaviour
diff --git a/camel/camel-mime-filter-windows.c b/camel/camel-mime-filter-windows.c
index ad6590a..ffe4bdd 100644
--- a/camel/camel-mime-filter-windows.c
+++ b/camel/camel-mime-filter-windows.c
@@ -43,7 +43,7 @@ struct _CamelMimeFilterWindowsPrivate {
 	gchar *claimed_charset;
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelMimeFilterWindows, camel_mime_filter_windows, CAMEL_TYPE_MIME_FILTER)
 
 static void
 mime_filter_windows_finalize (GObject *object)
@@ -55,7 +55,7 @@ mime_filter_windows_finalize (GObject *object)
 	g_free (priv->claimed_charset);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_mime_filter_windows_parent_class)->finalize (object);
 }
 
 static void
@@ -118,12 +118,11 @@ mime_filter_windows_reset (CamelMimeFilter *mime_filter)
 }
 
 static void
-mime_filter_windows_class_init (CamelMimeFilterWindowsClass *class)
+camel_mime_filter_windows_class_init (CamelMimeFilterWindowsClass *class)
 {
 	GObjectClass *object_class;
 	CamelMimeFilterClass *mime_filter_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelMimeFilterWindowsPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -136,29 +135,11 @@ mime_filter_windows_class_init (CamelMimeFilterWindowsClass *class)
 }
 
 static void
-mime_filter_windows_init (CamelMimeFilterWindows *filter)
+camel_mime_filter_windows_init (CamelMimeFilterWindows *filter)
 {
 	filter->priv = CAMEL_MIME_FILTER_WINDOWS_GET_PRIVATE (filter);
 }
 
-GType
-camel_mime_filter_windows_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_MIME_FILTER,
-			"CamelMimeFilterWindows",
-			sizeof (CamelMimeFilterWindowsClass),
-			(GClassInitFunc) mime_filter_windows_class_init,
-			sizeof (CamelMimeFilterWindows),
-			(GInstanceInitFunc) mime_filter_windows_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_mime_filter_windows_new:
  * @claimed_charset: ISO charset name
diff --git a/camel/camel-mime-filter-yenc.c b/camel/camel-mime-filter-yenc.c
index 3f81cc5..59fd869 100644
--- a/camel/camel-mime-filter-yenc.c
+++ b/camel/camel-mime-filter-yenc.c
@@ -43,7 +43,7 @@ struct _CamelMimeFilterYencPrivate {
 	guint32 crc;
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelMimeFilterYenc, camel_mime_filter_yenc, CAMEL_TYPE_MIME_FILTER)
 
 /* here we do all of the basic yEnc filtering */
 static void
@@ -209,11 +209,10 @@ mime_filter_yenc_reset (CamelMimeFilter *mime_filter)
 }
 
 static void
-mime_filter_yenc_class_init (CamelMimeFilterYencClass *class)
+camel_mime_filter_yenc_class_init (CamelMimeFilterYencClass *class)
 {
 	CamelMimeFilterClass *mime_filter_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelMimeFilterYencPrivate));
 
 	mime_filter_class = CAMEL_MIME_FILTER_CLASS (class);
@@ -223,7 +222,7 @@ mime_filter_yenc_class_init (CamelMimeFilterYencClass *class)
 }
 
 static void
-mime_filter_yenc_init (CamelMimeFilterYenc *filter)
+camel_mime_filter_yenc_init (CamelMimeFilterYenc *filter)
 {
 	filter->priv = CAMEL_MIME_FILTER_YENC_GET_PRIVATE (filter);
 
@@ -232,24 +231,6 @@ mime_filter_yenc_init (CamelMimeFilterYenc *filter)
 	filter->priv->crc = CAMEL_MIME_YENCODE_CRC_INIT;
 }
 
-GType
-camel_mime_filter_yenc_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_MIME_FILTER,
-			"CamelMimeFilterYenc",
-			sizeof (CamelMimeFilterYencClass),
-			(GClassInitFunc) mime_filter_yenc_class_init,
-			sizeof (CamelMimeFilterYenc),
-			(GInstanceInitFunc) mime_filter_yenc_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_mime_filter_yenc_new:
  * @direction: encode direction
diff --git a/camel/camel-mime-filter.c b/camel/camel-mime-filter.c
index 4cf4fab..f762549 100644
--- a/camel/camel-mime-filter.c
+++ b/camel/camel-mime-filter.c
@@ -41,7 +41,7 @@ struct _CamelMimeFilterPrivate {
 #define PRE_HEAD (64)
 #define BACK_HEAD (64)
 
-static gpointer parent_class;
+G_DEFINE_ABSTRACT_TYPE (CamelMimeFilter, camel_mime_filter, CAMEL_TYPE_OBJECT)
 
 static void
 mime_filter_finalize (GObject *object)
@@ -55,7 +55,7 @@ mime_filter_finalize (GObject *object)
 	g_free (mime_filter->priv->inbuf);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_mime_filter_parent_class)->finalize (object);
 }
 
 static void
@@ -71,11 +71,10 @@ mime_filter_complete (CamelMimeFilter *mime_filter,
 }
 
 static void
-mime_filter_class_init (CamelMimeFilterClass *class)
+camel_mime_filter_class_init (CamelMimeFilterClass *class)
 {
 	GObjectClass *object_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelMimeFilterPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -85,7 +84,7 @@ mime_filter_class_init (CamelMimeFilterClass *class)
 }
 
 static void
-mime_filter_init (CamelMimeFilter *mime_filter)
+camel_mime_filter_init (CamelMimeFilter *mime_filter)
 {
 	mime_filter->priv = CAMEL_MIME_FILTER_GET_PRIVATE (mime_filter);
 
@@ -98,24 +97,6 @@ mime_filter_init (CamelMimeFilter *mime_filter)
 	mime_filter->backlen = 0;
 }
 
-GType
-camel_mime_filter_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OBJECT,
-			"CamelMimeFilter",
-			sizeof (CamelMimeFilterClass),
-			(GClassInitFunc) mime_filter_class_init,
-			sizeof (CamelMimeFilter),
-			(GInstanceInitFunc) mime_filter_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_mime_filter_new:
  *
diff --git a/camel/camel-mime-message.c b/camel/camel-mime-message.c
index 3efe267..e46fb10 100644
--- a/camel/camel-mime-message.c
+++ b/camel/camel-mime-message.c
@@ -84,9 +84,10 @@ static const gchar *recipient_names[] = {
 	"To", "Cc", "Bcc", "Resent-To", "Resent-Cc", "Resent-Bcc", NULL
 };
 
-static gpointer parent_class;
 static GHashTable *header_name_table;
 
+G_DEFINE_TYPE (CamelMimeMessage, camel_mime_message, CAMEL_TYPE_MIME_PART)
+
 /* FIXME: check format of fields. */
 static gboolean
 process_header (CamelMedium *medium,
@@ -196,7 +197,7 @@ mime_message_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_mime_message_parent_class)->dispose (object);
 }
 
 static void
@@ -212,7 +213,7 @@ mime_message_finalize (GObject *object)
 	g_hash_table_destroy (message->recipients);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_mime_message_parent_class)->finalize (object);
 }
 
 static gssize
@@ -244,7 +245,7 @@ mime_message_write_to_stream (CamelDataWrapper *data_wrapper,
 		camel_medium_set_header ((CamelMedium *)mm, "Mime-Version", "1.0");
 
 	/* Chain up to parent's write_to_stream() method. */
-	data_wrapper_class = CAMEL_DATA_WRAPPER_CLASS (parent_class);
+	data_wrapper_class = CAMEL_DATA_WRAPPER_CLASS (camel_mime_message_parent_class);
 	return data_wrapper_class->write_to_stream (data_wrapper, stream, error);
 }
 
@@ -255,7 +256,7 @@ mime_message_add_header (CamelMedium *medium,
 {
 	CamelMediumClass *medium_class;
 
-	medium_class = CAMEL_MEDIUM_CLASS (parent_class);
+	medium_class = CAMEL_MEDIUM_CLASS (camel_mime_message_parent_class);
 
 	/* if we process it, then it must be forced unique as well ... */
 	if (process_header (medium, name, value))
@@ -272,7 +273,7 @@ mime_message_set_header (CamelMedium *medium,
 	process_header (medium, name, value);
 
 	/* Chain up to parent's set_header() method. */
-	CAMEL_MEDIUM_CLASS (parent_class)->set_header (medium, name, value);
+	CAMEL_MEDIUM_CLASS (camel_mime_message_parent_class)->set_header (medium, name, value);
 }
 
 static void
@@ -282,7 +283,7 @@ mime_message_remove_header (CamelMedium *medium,
 	process_header (medium, name, NULL);
 
 	/* Chain up to parent's remove_header() method. */
-	CAMEL_MEDIUM_CLASS (parent_class)->remove_header (medium, name);
+	CAMEL_MEDIUM_CLASS (camel_mime_message_parent_class)->remove_header (medium, name);
 }
 
 static gint
@@ -302,7 +303,7 @@ mime_message_construct_from_parser (CamelMimePart *dw,
 	d(printf("mime_message::construct_from_parser()\n"));
 
 	/* let the mime-part construct the guts ... */
-	mime_part_class = CAMEL_MIME_PART_CLASS (parent_class);
+	mime_part_class = CAMEL_MIME_PART_CLASS (camel_mime_message_parent_class);
 	ret = mime_part_class->construct_from_parser (dw, mp, error);
 
 	if (ret == -1)
@@ -334,7 +335,7 @@ mime_message_construct_from_parser (CamelMimePart *dw,
 }
 
 static void
-mime_message_class_init (CamelMimeMessageClass *class)
+camel_mime_message_class_init (CamelMimeMessageClass *class)
 {
 	GObjectClass *object_class;
 	CamelDataWrapperClass *data_wrapper_class;
@@ -342,8 +343,6 @@ mime_message_class_init (CamelMimeMessageClass *class)
 	CamelMediumClass *medium_class;
 	gint ii;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->dispose = mime_message_dispose;
 	object_class->finalize = mime_message_finalize;
@@ -371,7 +370,7 @@ mime_message_class_init (CamelMimeMessageClass *class)
 }
 
 static void
-mime_message_init (CamelMimeMessage *mime_message)
+camel_mime_message_init (CamelMimeMessage *mime_message)
 {
 	gint ii;
 
@@ -394,24 +393,6 @@ mime_message_init (CamelMimeMessage *mime_message)
 	mime_message->message_id = NULL;
 }
 
-GType
-camel_mime_message_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_MIME_PART,
-			"CamelMimeMessage",
-			sizeof (CamelMimeMessageClass),
-			(GClassInitFunc) mime_message_class_init,
-			sizeof (CamelMimeMessage),
-			(GInstanceInitFunc) mime_message_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_mime_message_new:
  *
@@ -454,7 +435,7 @@ camel_mime_message_set_date (CamelMimeMessage *message,  time_t date, gint offse
 	message->date_offset = offset;
 
 	datestr = camel_header_format_date (date, offset);
-	CAMEL_MEDIUM_CLASS (parent_class)->set_header ((CamelMedium *)message, "Date", datestr);
+	CAMEL_MEDIUM_CLASS (camel_mime_message_parent_class)->set_header ((CamelMedium *)message, "Date", datestr);
 	g_free (datestr);
 }
 
@@ -530,7 +511,7 @@ camel_mime_message_set_message_id (CamelMimeMessage *mime_message, const gchar *
 
 	mime_message->message_id = id;
 	id = g_strdup_printf ("<%s>", mime_message->message_id);
-	CAMEL_MEDIUM_CLASS (parent_class)->set_header (CAMEL_MEDIUM (mime_message), "Message-ID", id);
+	CAMEL_MEDIUM_CLASS (camel_mime_message_parent_class)->set_header (CAMEL_MEDIUM (mime_message), "Message-ID", id);
 	g_free (id);
 }
 
@@ -572,13 +553,13 @@ camel_mime_message_set_reply_to (CamelMimeMessage *msg, const CamelInternetAddre
 	}
 
 	if (reply_to == NULL) {
-		CAMEL_MEDIUM_CLASS (parent_class)->remove_header (CAMEL_MEDIUM (msg), "Reply-To");
+		CAMEL_MEDIUM_CLASS (camel_mime_message_parent_class)->remove_header (CAMEL_MEDIUM (msg), "Reply-To");
 		return;
 	}
 
 	msg->reply_to = (CamelInternetAddress *)camel_address_new_clone ((CamelAddress *)reply_to);
 	addr = camel_address_encode ((CamelAddress *)msg->reply_to);
-	CAMEL_MEDIUM_CLASS (parent_class)->set_header (CAMEL_MEDIUM (msg), "Reply-To", addr);
+	CAMEL_MEDIUM_CLASS (camel_mime_message_parent_class)->set_header (CAMEL_MEDIUM (msg), "Reply-To", addr);
 	g_free (addr);
 }
 
@@ -626,7 +607,7 @@ camel_mime_message_set_subject (CamelMimeMessage *message, const gchar *subject)
 		text = NULL;
 	}
 
-	CAMEL_MEDIUM_CLASS (parent_class)->set_header (CAMEL_MEDIUM (message), "Subject", text);
+	CAMEL_MEDIUM_CLASS (camel_mime_message_parent_class)->set_header (CAMEL_MEDIUM (message), "Subject", text);
 	g_free (text);
 }
 
@@ -672,13 +653,13 @@ camel_mime_message_set_from (CamelMimeMessage *msg, const CamelInternetAddress *
 	}
 
 	if (from == NULL || camel_address_length((CamelAddress *)from) == 0) {
-		CAMEL_MEDIUM_CLASS(parent_class)->remove_header(CAMEL_MEDIUM(msg), "From");
+		CAMEL_MEDIUM_CLASS(camel_mime_message_parent_class)->remove_header(CAMEL_MEDIUM(msg), "From");
 		return;
 	}
 
 	msg->from = (CamelInternetAddress *)camel_address_new_clone((CamelAddress *)from);
 	addr = camel_address_encode((CamelAddress *)msg->from);
-	CAMEL_MEDIUM_CLASS (parent_class)->set_header(CAMEL_MEDIUM(msg), "From", addr);
+	CAMEL_MEDIUM_CLASS (camel_mime_message_parent_class)->set_header(CAMEL_MEDIUM(msg), "From", addr);
 	g_free(addr);
 }
 
@@ -726,7 +707,7 @@ camel_mime_message_set_recipients(CamelMimeMessage *mime_message, const gchar *t
 
 	if (r == NULL || camel_address_length ((CamelAddress *)r) == 0) {
 		camel_address_remove ((CamelAddress *)addr, -1);
-		CAMEL_MEDIUM_CLASS (parent_class)->remove_header (CAMEL_MEDIUM (mime_message), type);
+		CAMEL_MEDIUM_CLASS (camel_mime_message_parent_class)->remove_header (CAMEL_MEDIUM (mime_message), type);
 		return;
 	}
 
@@ -735,7 +716,7 @@ camel_mime_message_set_recipients(CamelMimeMessage *mime_message, const gchar *t
 
 	/* and sync our headers */
 	text = camel_address_encode (CAMEL_ADDRESS (addr));
-	CAMEL_MEDIUM_CLASS (parent_class)->set_header (CAMEL_MEDIUM (mime_message), type, text);
+	CAMEL_MEDIUM_CLASS (camel_mime_message_parent_class)->set_header (CAMEL_MEDIUM (mime_message), type, text);
 	g_free(text);
 }
 
diff --git a/camel/camel-mime-parser.c b/camel/camel-mime-parser.c
index 57443fd..7312358 100644
--- a/camel/camel-mime-parser.c
+++ b/camel/camel-mime-parser.c
@@ -150,9 +150,6 @@ static off_t folder_tell(struct _header_scan_state *s);
 static gint folder_read(struct _header_scan_state *s);
 static void folder_push_part(struct _header_scan_state *s, struct _header_scan_stack *h);
 
-static void mime_parser_class_init (CamelMimeParserClass *class);
-static void mime_parser_init       (CamelMimeParser *obj);
-
 #if d(!)0
 static gchar *states[] = {
 	"CAMEL_MIME_PARSER_STATE_INITIAL",
@@ -175,7 +172,7 @@ static gchar *states[] = {
 };
 #endif
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelMimeParser, camel_mime_parser, CAMEL_TYPE_OBJECT)
 
 static void
 mime_parser_finalize (GObject *object)
@@ -189,44 +186,24 @@ mime_parser_finalize (GObject *object)
 	folder_scan_close(s);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_mime_parser_parent_class)->finalize (object);
 }
 
 static void
-mime_parser_class_init (CamelMimeParserClass *class)
+camel_mime_parser_class_init (CamelMimeParserClass *class)
 {
 	GObjectClass *object_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->finalize = mime_parser_finalize;
 }
 
 static void
-mime_parser_init (CamelMimeParser *parser)
+camel_mime_parser_init (CamelMimeParser *parser)
 {
 	parser->priv = folder_scan_init();
 }
 
-GType
-camel_mime_parser_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OBJECT,
-			"CamelMimeParser",
-			sizeof (CamelMimeParserClass),
-			(GClassInitFunc) mime_parser_class_init,
-			sizeof (CamelMimeParser),
-			(GInstanceInitFunc) mime_parser_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_mime_parser_new:
  *
diff --git a/camel/camel-mime-part.c b/camel/camel-mime-part.c
index 3acdb7f..699c101 100644
--- a/camel/camel-mime-part.c
+++ b/camel/camel-mime-part.c
@@ -91,7 +91,7 @@ typedef enum {
 static GHashTable *header_name_table;
 static GHashTable *header_formatted_table;
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelMimePart, camel_mime_part, CAMEL_TYPE_MEDIUM)
 
 static gssize
 write_raw (CamelStream *stream,
@@ -389,7 +389,7 @@ mime_part_finalize (GObject *object)
 	g_queue_free (priv->raw_headers);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_mime_part_parent_class)->finalize (object);
 }
 
 static void
@@ -495,7 +495,7 @@ mime_part_set_content (CamelMedium *medium,
 	CamelContentType *content_type;
 
 	/* Chain up to parent's set_content() method. */
-	medium_class = CAMEL_MEDIUM_CLASS (parent_class);
+	medium_class = CAMEL_MEDIUM_CLASS (camel_mime_part_parent_class);
 	medium_class->set_content (medium, content);
 
 	content_type = camel_data_wrapper_get_mime_type_field (content);
@@ -778,13 +778,12 @@ mime_part_construct_from_parser (CamelMimePart *mime_part,
 }
 
 static void
-mime_part_class_init (CamelMimePartClass *class)
+camel_mime_part_class_init (CamelMimePartClass *class)
 {
 	GObjectClass *object_class;
 	CamelMediumClass *medium_class;
 	CamelDataWrapperClass *data_wrapper_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelMimePartPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -851,7 +850,7 @@ mime_part_class_init (CamelMimePartClass *class)
 }
 
 static void
-mime_part_init (CamelMimePart *mime_part)
+camel_mime_part_init (CamelMimePart *mime_part)
 {
 	CamelDataWrapper *data_wrapper;
 
@@ -867,24 +866,6 @@ mime_part_init (CamelMimePart *mime_part)
 	data_wrapper->mime_type = camel_content_type_new ("text", "plain");
 }
 
-GType
-camel_mime_part_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_MEDIUM,
-			"CamelMimePart",
-			sizeof (CamelMimePartClass),
-			(GClassInitFunc) mime_part_class_init,
-			sizeof (CamelMimePart),
-			(GInstanceInitFunc) mime_part_init,
-			0);
-
-	return type;
-}
-
 /* **** Content-Description */
 
 /**
diff --git a/camel/camel-multipart-encrypted.c b/camel/camel-multipart-encrypted.c
index 600b672..825f394 100644
--- a/camel/camel-multipart-encrypted.c
+++ b/camel/camel-multipart-encrypted.c
@@ -37,7 +37,7 @@
 #include "camel-stream-fs.h"
 #include "camel-stream-mem.h"
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelMultipartEncrypted, camel_multipart_encrypted, CAMEL_TYPE_MULTIPART)
 
 static void
 multipart_encrypted_dispose (GObject *object)
@@ -52,7 +52,7 @@ multipart_encrypted_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_multipart_encrypted_parent_class)->dispose (object);
 }
 
 static void
@@ -65,7 +65,7 @@ multipart_encrypted_finalize (GObject *object)
 	g_free (multipart->protocol);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_multipart_encrypted_parent_class)->finalize (object);
 }
 
 /* we snoop the mime type to get the protocol */
@@ -87,18 +87,16 @@ multipart_encrypted_set_mime_type_field (CamelDataWrapper *data_wrapper,
 	}
 
 	/* Chain up to parent's set_mime_type_field() method. */
-	data_wrapper_class = CAMEL_DATA_WRAPPER_CLASS (parent_class);
+	data_wrapper_class = CAMEL_DATA_WRAPPER_CLASS (camel_multipart_encrypted_parent_class);
 	data_wrapper_class->set_mime_type_field (data_wrapper, mime_type);
 }
 
 static void
-multipart_encrypted_class_init (CamelMultipartEncryptedClass *class)
+camel_multipart_encrypted_class_init (CamelMultipartEncryptedClass *class)
 {
 	GObjectClass *object_class;
 	CamelDataWrapperClass *data_wrapper_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->dispose = multipart_encrypted_dispose;
 	object_class->finalize = multipart_encrypted_finalize;
@@ -109,7 +107,7 @@ multipart_encrypted_class_init (CamelMultipartEncryptedClass *class)
 }
 
 static void
-multipart_encrypted_init (CamelMultipartEncrypted *multipart)
+camel_multipart_encrypted_init (CamelMultipartEncrypted *multipart)
 {
 	camel_data_wrapper_set_mime_type (
 		CAMEL_DATA_WRAPPER (multipart), "multipart/encrypted");
@@ -117,24 +115,6 @@ multipart_encrypted_init (CamelMultipartEncrypted *multipart)
 	multipart->decrypted = NULL;
 }
 
-GType
-camel_multipart_encrypted_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_MULTIPART,
-			"CamelMultipartEncrypted",
-			sizeof (CamelMultipartEncryptedClass),
-			(GClassInitFunc) multipart_encrypted_class_init,
-			sizeof (CamelMultipartEncrypted),
-			(GInstanceInitFunc) multipart_encrypted_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_multipart_encrypted_new:
  *
diff --git a/camel/camel-multipart-signed.c b/camel/camel-multipart-signed.c
index ab41f83..a045d1d 100644
--- a/camel/camel-multipart-signed.c
+++ b/camel/camel-multipart-signed.c
@@ -50,7 +50,7 @@
 #define d(x) /*(printf("%s(%d): ", __FILE__, __LINE__),(x))
 	       #include <stdio.h>;*/
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelMultipartSigned, camel_multipart_signed, CAMEL_TYPE_MULTIPART)
 
 static gint
 multipart_signed_skip_content (CamelMimeParser *cmp)
@@ -214,7 +214,7 @@ multipart_signed_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_multipart_signed_parent_class)->dispose (object);
 }
 
 static void
@@ -228,7 +228,7 @@ multipart_signed_finalize (GObject *object)
 	g_free (multipart->micalg);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_multipart_signed_parent_class)->finalize (object);
 }
 
 static void
@@ -241,7 +241,7 @@ multipart_signed_set_mime_type_field (CamelDataWrapper *data_wrapper,
 	/* we snoop the mime type to get boundary and hash info */
 
 	/* Chain up to parent's set_mime_type_field() method. */
-	data_wrapper_class = CAMEL_DATA_WRAPPER_CLASS (parent_class);
+	data_wrapper_class = CAMEL_DATA_WRAPPER_CLASS (camel_multipart_signed_parent_class);
 	data_wrapper_class->set_mime_type_field(data_wrapper, mime_type);
 
 	if (mime_type) {
@@ -501,14 +501,12 @@ multipart_signed_construct_from_parser (CamelMultipart *multipart,
 }
 
 static void
-multipart_signed_class_init (CamelMultipartSignedClass *class)
+camel_multipart_signed_class_init (CamelMultipartSignedClass *class)
 {
 	GObjectClass *object_class;
 	CamelDataWrapperClass *data_wrapper_class;
 	CamelMultipartClass *multipart_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->dispose = multipart_signed_dispose;
 	object_class->finalize = multipart_signed_finalize;
@@ -530,7 +528,7 @@ multipart_signed_class_init (CamelMultipartSignedClass *class)
 }
 
 static void
-multipart_signed_init (CamelMultipartSigned *multipart)
+camel_multipart_signed_init (CamelMultipartSigned *multipart)
 {
 	camel_data_wrapper_set_mime_type (
 		CAMEL_DATA_WRAPPER (multipart), "multipart/signed");
@@ -538,24 +536,6 @@ multipart_signed_init (CamelMultipartSigned *multipart)
 	multipart->start1 = -1;
 }
 
-GType
-camel_multipart_signed_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_MULTIPART,
-			"CamelMultipartSigned",
-			sizeof (CamelMultipartSignedClass),
-			(GClassInitFunc) multipart_signed_class_init,
-			sizeof (CamelMultipartSigned),
-			(GInstanceInitFunc) multipart_signed_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_multipart_signed_new:
  *
diff --git a/camel/camel-multipart.c b/camel/camel-multipart.c
index 1b853a5..dee33e0 100644
--- a/camel/camel-multipart.c
+++ b/camel/camel-multipart.c
@@ -37,7 +37,7 @@
 
 #define d(x)
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelMultipart, camel_multipart, CAMEL_TYPE_DATA_WRAPPER)
 
 static void
 multipart_dispose (GObject *object)
@@ -49,7 +49,7 @@ multipart_dispose (GObject *object)
 	multipart->parts = NULL;
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_multipart_parent_class)->dispose (object);
 }
 
 static void
@@ -61,7 +61,7 @@ multipart_finalize (GObject *object)
 	g_free (multipart->postface);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_multipart_parent_class)->finalize (object);
 }
 
 /* this is MIME specific, doesn't belong here really */
@@ -141,7 +141,7 @@ multipart_is_offline (CamelDataWrapper *data_wrapper)
 	GList *node;
 	CamelDataWrapper *part;
 
-	if (CAMEL_DATA_WRAPPER_CLASS (parent_class)->is_offline (data_wrapper))
+	if (CAMEL_DATA_WRAPPER_CLASS (camel_multipart_parent_class)->is_offline (data_wrapper))
 		return TRUE;
 	for (node = multipart->parts; node; node = node->next) {
 		part = node->data;
@@ -319,13 +319,11 @@ multipart_construct_from_parser (CamelMultipart *multipart,
 }
 
 static void
-multipart_class_init (CamelMultipartClass *class)
+camel_multipart_class_init (CamelMultipartClass *class)
 {
 	GObjectClass *object_class;
 	CamelDataWrapperClass *data_wrapper_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->dispose = multipart_dispose;
 	object_class->finalize = multipart_finalize;
@@ -347,7 +345,7 @@ multipart_class_init (CamelMultipartClass *class)
 }
 
 static void
-multipart_init (CamelMultipart *multipart)
+camel_multipart_init (CamelMultipart *multipart)
 {
 	camel_data_wrapper_set_mime_type (
 		CAMEL_DATA_WRAPPER (multipart), "multipart/mixed");
@@ -356,25 +354,6 @@ multipart_init (CamelMultipart *multipart)
 	multipart->postface = NULL;
 }
 
-GType
-camel_multipart_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID)) {
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_DATA_WRAPPER,
-			"CamelMultipart",
-			sizeof (CamelMultipartClass),
-			(GClassInitFunc) multipart_class_init,
-			sizeof (CamelMultipart),
-			(GInstanceInitFunc) multipart_init,
-			0);
-	}
-
-	return type;
-}
-
 /**
  * camel_multipart_new:
  *
diff --git a/camel/camel-news-address.c b/camel/camel-news-address.c
index 530a732..f48fca6 100644
--- a/camel/camel-news-address.c
+++ b/camel/camel-news-address.c
@@ -20,23 +20,7 @@
 
 #include "camel-news-address.h"
 
-GType
-camel_news_address_get_type (void)
-{
-	static guint type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_ADDRESS,
-			"CamelNewsAddress",
-			sizeof (CamelNewsAddressClass),
-			(GClassInitFunc) NULL,
-			sizeof (CamelNewsAddress),
-			(GInstanceInitFunc) NULL,
-			0);
-
-	return type;
-}
+G_DEFINE_TYPE (CamelNewsAddress, camel_news_address, CAMEL_TYPE_ADDRESS)
 
 /**
  * camel_news_address_new:
diff --git a/camel/camel-nntp-address.c b/camel/camel-nntp-address.c
index 46e30c3..d583b5b 100644
--- a/camel/camel-nntp-address.c
+++ b/camel/camel-nntp-address.c
@@ -31,13 +31,13 @@ static gchar * nntp_address_encode		(CamelAddress *);
 static gint    nntp_address_cat		(CamelAddress *dest, CamelAddress *source);
 static void   nntp_address_remove		(CamelAddress *, gint index);
 
-static gpointer parent_class;
-
 struct _address {
 	gchar *name;
 	gchar *address;
 };
 
+G_DEFINE_TYPE (CamelNNTPAddress, camel_nntp_address, CAMEL_TYPE_ADDRESS)
+
 /* since newsgropus are 7bit ascii, decode/unformat are the same */
 static gint
 nntp_address_decode (CamelAddress *address,
@@ -111,12 +111,10 @@ nntp_address_remove (CamelAddress *address,
 }
 
 static void
-nntp_address_class_init(CamelNNTPAddressClass *class)
+camel_nntp_address_class_init (CamelNNTPAddressClass *class)
 {
 	CamelAddressClass *address_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	address_class = CAMEL_ADDRESS_CLASS (class);
 	address_class->decode = nntp_address_decode;
 	address_class->encode = nntp_address_encode;
@@ -126,22 +124,9 @@ nntp_address_class_init(CamelNNTPAddressClass *class)
 	address_class->cat = nntp_address_cat;
 }
 
-GType
-camel_nntp_address_get_type(void)
+static void
+camel_nntp_address_init (CamelNNTPAddress *nntp_address)
 {
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_ADDRESS,
-			"CamelNNTPAddress",
-			sizeof (CamelNNTPAddressClass),
-			(GClassInitFunc) nntp_address_class_init,
-			sizeof (CamelNNTPAddress),
-			(GInstanceInitFunc) NULL,
-			0);
-
-	return type;
 }
 
 /**
diff --git a/camel/camel-object.c b/camel/camel-object.c
index 1b15dd5..965cfaf 100644
--- a/camel/camel-object.c
+++ b/camel/camel-object.c
@@ -38,7 +38,7 @@
 #define b(x)			/* object bag */
 #define h(x)			/* hooks */
 
-static gpointer parent_class;
+G_DEFINE_ABSTRACT_TYPE (CamelObject, camel_object, G_TYPE_OBJECT)
 
 /* ** Quickie type system ************************************************* */
 
@@ -514,16 +514,14 @@ object_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_object_parent_class)->dispose (object);
 }
 
 static void
-object_class_init (CamelObjectClass *class)
+camel_object_class_init (CamelObjectClass *class)
 {
 	GObjectClass *object_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->dispose = object_dispose;
 
@@ -541,22 +539,9 @@ object_class_init (CamelObjectClass *class)
 	camel_object_class_add_event (class, "finalize", NULL);
 }
 
-GType
-camel_object_get_type(void)
+static void
+camel_object_init (CamelObject *object)
 {
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			G_TYPE_OBJECT,
-			"CamelObject",
-			sizeof (CamelObjectClass),
-			(GClassInitFunc) object_class_init,
-			sizeof (CamelObject),
-			(GInstanceInitFunc) NULL,
-			0);
-
-	return type;
 }
 
 GQuark
diff --git a/camel/camel-offline-folder.c b/camel/camel-offline-folder.c
index e85772d..5daad5e 100644
--- a/camel/camel-offline-folder.c
+++ b/camel/camel-offline-folder.c
@@ -31,8 +31,6 @@
 #include "camel-service.h"
 #include "camel-session.h"
 
-static gpointer parent_class;
-
 static GSList *offline_folder_props = NULL;
 
 static CamelProperty offline_prop_list[] = {
@@ -46,6 +44,8 @@ struct _offline_downsync_msg {
 	CamelFolderChangeInfo *changes;
 };
 
+G_DEFINE_TYPE (CamelOfflineFolder, camel_offline_folder, CAMEL_TYPE_FOLDER)
+
 static void
 offline_downsync_sync (CamelSession *session, CamelSessionThreadMsg *mm)
 {
@@ -125,7 +125,7 @@ offline_folder_getv (CamelObject *object,
 		case CAMEL_FOLDER_ARG_PROPERTIES:
 			props.argc = 1;
 			props.argv[0] = *arg;
-			((CamelObjectClass *) parent_class)->getv (object, error, &props);
+			((CamelObjectClass *) camel_offline_folder_parent_class)->getv (object, error, &props);
 			*arg->ca_ptr = g_slist_concat (*arg->ca_ptr, g_slist_copy (offline_folder_props));
 			break;
 		case CAMEL_OFFLINE_FOLDER_ARG_SYNC_OFFLINE:
@@ -140,7 +140,7 @@ offline_folder_getv (CamelObject *object,
 	}
 
 	if (count)
-		return ((CamelObjectClass *) parent_class)->getv (object, error, args);
+		return ((CamelObjectClass *) camel_offline_folder_parent_class)->getv (object, error, args);
 
 	return 0;
 }
@@ -177,7 +177,7 @@ offline_folder_setv (CamelObject *object,
 	if (save)
 		camel_object_state_write (object);
 
-	return ((CamelObjectClass *) parent_class)->setv (object, error, args);
+	return ((CamelObjectClass *) camel_offline_folder_parent_class)->setv (object, error, args);
 }
 
 static void
@@ -223,13 +223,11 @@ done:
 }
 
 static void
-offline_folder_class_init (CamelOfflineFolderClass *class)
+camel_offline_folder_class_init (CamelOfflineFolderClass *class)
 {
 	CamelObjectClass *camel_object_class;
 	gint ii;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	camel_object_class = CAMEL_OBJECT_CLASS (class);
 	camel_object_class->getv = offline_folder_getv;
 	camel_object_class->setv = offline_folder_setv;
@@ -246,31 +244,13 @@ offline_folder_class_init (CamelOfflineFolderClass *class)
 }
 
 static void
-offline_folder_init (CamelOfflineFolder *folder)
+camel_offline_folder_init (CamelOfflineFolder *folder)
 {
 	camel_object_hook_event (
 		folder, "folder_changed",
 		(CamelObjectEventHookFunc) offline_folder_changed, NULL);
 }
 
-GType
-camel_offline_folder_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_FOLDER,
-			"CamelOfflineFolder",
-			sizeof (CamelOfflineFolderClass),
-			(GClassInitFunc) offline_folder_class_init,
-			sizeof (CamelOfflineFolder),
-			(GInstanceInitFunc) offline_folder_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_offline_folder_downsync:
  * @offline: a #CamelOfflineFolder object
diff --git a/camel/camel-offline-journal.c b/camel/camel-offline-journal.c
index 376715b..e65f190 100644
--- a/camel/camel-offline-journal.c
+++ b/camel/camel-offline-journal.c
@@ -45,7 +45,7 @@
 
 #define d(x)
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelOfflineJournal, camel_offline_journal, CAMEL_TYPE_OBJECT)
 
 static void
 offline_journal_finalize (GObject *object)
@@ -59,46 +59,26 @@ offline_journal_finalize (GObject *object)
 		CAMEL_OFFLINE_JOURNAL_GET_CLASS (journal)->entry_free (journal, entry);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_offline_journal_parent_class)->finalize (object);
 }
 
 static void
-offline_journal_class_init (CamelOfflineJournalClass *class)
+camel_offline_journal_class_init (CamelOfflineJournalClass *class)
 {
 	GObjectClass *object_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->finalize = offline_journal_finalize;
 }
 
 static void
-offline_journal_init (CamelOfflineJournal *journal)
+camel_offline_journal_init (CamelOfflineJournal *journal)
 {
 	journal->folder = NULL;
 	journal->filename = NULL;
 	camel_dlist_init (&journal->queue);
 }
 
-GType
-camel_offline_journal_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OBJECT,
-			"CamelOfflineJournal",
-			sizeof (CamelOfflineJournalClass),
-			(GClassInitFunc) offline_journal_class_init,
-			sizeof (CamelOfflineJournal),
-			(GInstanceInitFunc) offline_journal_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_offline_journal_construct:
  * @journal: a #CamelOfflineJournal object
diff --git a/camel/camel-offline-store.c b/camel/camel-offline-store.c
index 32a9920..80e7a09 100644
--- a/camel/camel-offline-store.c
+++ b/camel/camel-offline-store.c
@@ -31,7 +31,7 @@
 #include "camel-offline-store.h"
 #include "camel-session.h"
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelOfflineStore, camel_offline_store, CAMEL_TYPE_STORE)
 
 static gboolean
 offline_store_construct (CamelService *service,
@@ -44,7 +44,7 @@ offline_store_construct (CamelService *service,
 	CamelServiceClass *service_class;
 
 	/* Chain up to parent's construct() method. */
-	service_class = CAMEL_SERVICE_CLASS (parent_class);
+	service_class = CAMEL_SERVICE_CLASS (camel_offline_store_parent_class);
 	if (!service_class->construct (service, session, provider, url, error))
 		return FALSE;
 
@@ -56,40 +56,20 @@ offline_store_construct (CamelService *service,
 }
 
 static void
-offline_store_class_init (CamelOfflineStoreClass *class)
+camel_offline_store_class_init (CamelOfflineStoreClass *class)
 {
 	CamelServiceClass *service_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	service_class = CAMEL_SERVICE_CLASS (class);
 	service_class->construct = offline_store_construct;
 }
 
 static void
-offline_store_init (CamelOfflineStore *store)
+camel_offline_store_init (CamelOfflineStore *store)
 {
 	store->state = CAMEL_OFFLINE_STORE_NETWORK_AVAIL;
 }
 
-GType
-camel_offline_store_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_STORE,
-			"CamelOfflineStore",
-			sizeof (CamelOfflineStoreClass),
-			(GClassInitFunc) offline_store_class_init,
-			sizeof (CamelOfflineStore),
-			(GInstanceInitFunc) offline_store_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_offline_store_get_network_state:
  * @store: a #CamelOfflineStore object
diff --git a/camel/camel-partition-table.c b/camel/camel-partition-table.c
index 1fcc787..adfe676 100644
--- a/camel/camel-partition-table.c
+++ b/camel/camel-partition-table.c
@@ -56,7 +56,7 @@ struct _CamelPartitionTablePrivate {
 #define CAMEL_PARTITION_TABLE_LOCK(kf, lock) (pthread_mutex_lock (&(kf)->priv->lock))
 #define CAMEL_PARTITION_TABLE_UNLOCK(kf, lock) (pthread_mutex_unlock (&(kf)->priv->lock))
 
-static gpointer partition_table_parent_class;
+G_DEFINE_TYPE (CamelPartitionTable, camel_partition_table, CAMEL_TYPE_OBJECT)
 
 static void
 partition_table_finalize (GObject *object)
@@ -77,15 +77,14 @@ partition_table_finalize (GObject *object)
 	pthread_mutex_destroy (&table->priv->lock);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (partition_table_parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_partition_table_parent_class)->finalize (object);
 }
 
 static void
-partition_table_class_init (CamelPartitionTableClass *class)
+camel_partition_table_class_init (CamelPartitionTableClass *class)
 {
 	GObjectClass *object_class;
 
-	partition_table_parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelPartitionTablePrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -93,7 +92,7 @@ partition_table_class_init (CamelPartitionTableClass *class)
 }
 
 static void
-partition_table_init (CamelPartitionTable *cpi)
+camel_partition_table_init (CamelPartitionTable *cpi)
 {
 	cpi->priv = CAMEL_PARTITION_TABLE_GET_PRIVATE (cpi);
 
@@ -101,24 +100,6 @@ partition_table_init (CamelPartitionTable *cpi)
 	pthread_mutex_init (&cpi->priv->lock, NULL);
 }
 
-GType
-camel_partition_table_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OBJECT,
-			"CamelPartitionTable",
-			sizeof (CamelPartitionTableClass),
-			(GClassInitFunc) partition_table_class_init,
-			sizeof (CamelPartitionTable),
-			(GInstanceInitFunc) partition_table_init,
-			0);
-
-	return type;
-}
-
 /* ********************************************************************** */
 
 /*
@@ -625,7 +606,7 @@ struct _CamelKeyTablePrivate {
 #define CAMEL_KEY_TABLE_LOCK(kf, lock) (pthread_mutex_lock (&(kf)->priv->lock))
 #define CAMEL_KEY_TABLE_UNLOCK(kf, lock) (pthread_mutex_unlock (&(kf)->priv->lock))
 
-static gpointer key_table_parent_class;
+G_DEFINE_TYPE (CamelKeyTable, camel_key_table, CAMEL_TYPE_OBJECT)
 
 static void
 key_table_finalize (GObject *object)
@@ -644,15 +625,14 @@ key_table_finalize (GObject *object)
 	pthread_mutex_destroy (&table->priv->lock);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (key_table_parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_key_table_parent_class)->finalize (object);
 }
 
 static void
-key_table_class_init (CamelKeyTableClass *class)
+camel_key_table_class_init (CamelKeyTableClass *class)
 {
 	GObjectClass *object_class;
 
-	key_table_parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelKeyTablePrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -660,31 +640,12 @@ key_table_class_init (CamelKeyTableClass *class)
 }
 
 static void
-key_table_init (CamelKeyTable *table)
+camel_key_table_init (CamelKeyTable *table)
 {
 	table->priv = CAMEL_KEY_TABLE_GET_PRIVATE (table);
 	pthread_mutex_init (&table->priv->lock, NULL);
 }
 
-GType
-camel_key_table_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID)) {
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OBJECT,
-			"CamelKeyTable",
-			sizeof (CamelKeyTableClass),
-			(GClassInitFunc) key_table_class_init,
-			sizeof (CamelKeyTable),
-			(GInstanceInitFunc) key_table_init,
-			0);
-	}
-
-	return type;
-}
-
 CamelKeyTable *
 camel_key_table_new (CamelBlockFile *bs,
                      camel_block_t root,
diff --git a/camel/camel-sasl-anonymous.c b/camel/camel-sasl-anonymous.c
index 72b66c6..f197c13 100644
--- a/camel/camel-sasl-anonymous.c
+++ b/camel/camel-sasl-anonymous.c
@@ -40,7 +40,7 @@ CamelServiceAuthType camel_sasl_anonymous_authtype = {
 	FALSE
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelSaslAnonymous, camel_sasl_anonymous, CAMEL_TYPE_SASL)
 
 static GByteArray *
 sasl_anonymous_challenge (CamelSasl *sasl,
@@ -111,17 +111,15 @@ sasl_anonymous_finalize (GObject *object)
 	g_free (sasl->trace_info);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_sasl_anonymous_parent_class)->finalize (object);
 }
 
 static void
-sasl_anonymous_class_init (CamelSaslAnonymousClass *class)
+camel_sasl_anonymous_class_init (CamelSaslAnonymousClass *class)
 {
 	GObjectClass *object_class;
 	CamelSaslClass *sasl_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->finalize = sasl_anonymous_finalize;
 
@@ -129,22 +127,9 @@ sasl_anonymous_class_init (CamelSaslAnonymousClass *class)
 	sasl_class->challenge = sasl_anonymous_challenge;
 }
 
-GType
-camel_sasl_anonymous_get_type (void)
+static void
+camel_sasl_anonymous_init (CamelSaslAnonymous *sasl_anonymous)
 {
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_SASL,
-			"CamelSaslAnonymous",
-			sizeof (CamelSaslAnonymousClass),
-			(GClassInitFunc) sasl_anonymous_class_init,
-			sizeof (CamelSaslAnonymous),
-			(GInstanceInitFunc) NULL,
-			0);
-
-	return type;
 }
 
 /**
diff --git a/camel/camel-sasl-cram-md5.c b/camel/camel-sasl-cram-md5.c
index 3f643e7..d8aad81 100644
--- a/camel/camel-sasl-cram-md5.c
+++ b/camel/camel-sasl-cram-md5.c
@@ -51,7 +51,7 @@ CamelServiceAuthType camel_sasl_cram_md5_authtype = {
 	TRUE
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelSaslCramMd5, camel_sasl_cram_md5, CAMEL_TYPE_SASL)
 
 /* CRAM-MD5 algorithm:
  * MD5 ((passwd XOR opad), MD5 ((passwd XOR ipad), timestamp))
@@ -132,11 +132,10 @@ sasl_cram_md5_challenge (CamelSasl *sasl,
 }
 
 static void
-sasl_cram_md5_class_init (CamelSaslCramMd5Class *class)
+camel_sasl_cram_md5_class_init (CamelSaslCramMd5Class *class)
 {
 	CamelSaslClass *sasl_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelSaslCramMd5Private));
 
 	sasl_class = CAMEL_SASL_CLASS (class);
@@ -144,25 +143,8 @@ sasl_cram_md5_class_init (CamelSaslCramMd5Class *class)
 }
 
 static void
-sasl_cram_md5_init (CamelSaslCramMd5 *sasl)
+camel_sasl_cram_md5_init (CamelSaslCramMd5 *sasl)
 {
 	sasl->priv = CAMEL_SASL_CRAM_MD5_GET_PRIVATE (sasl);
 }
 
-GType
-camel_sasl_cram_md5_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_SASL,
-			"CamelSaslCramMd5",
-			sizeof (CamelSaslCramMd5Class),
-			(GClassInitFunc) sasl_cram_md5_class_init,
-			sizeof (CamelSaslCramMd5),
-			(GInstanceInitFunc) sasl_cram_md5_init,
-			0);
-
-	return type;
-}
diff --git a/camel/camel-sasl-digest-md5.c b/camel/camel-sasl-digest-md5.c
index 344fde1..96e9e8f 100644
--- a/camel/camel-sasl-digest-md5.c
+++ b/camel/camel-sasl-digest-md5.c
@@ -57,8 +57,6 @@ CamelServiceAuthType camel_sasl_digest_md5_authtype = {
 	TRUE
 };
 
-static gpointer parent_class;
-
 enum {
 	STATE_AUTH,
 	STATE_FINAL
@@ -166,6 +164,8 @@ struct _CamelSaslDigestMd5Private {
 	gint state;
 };
 
+G_DEFINE_TYPE (CamelSaslDigestMd5, camel_sasl_digest_md5, CAMEL_TYPE_SASL)
+
 static void
 decode_lwsp (const gchar **in)
 {
@@ -776,7 +776,7 @@ sasl_digest_md5_finalize (GObject *object)
 	}
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_sasl_digest_md5_parent_class)->finalize (object);
 }
 
 static GByteArray *
@@ -918,12 +918,11 @@ sasl_digest_md5_challenge (CamelSasl *sasl,
 }
 
 static void
-sasl_digest_md5_class_init (CamelSaslDigestMd5Class *class)
+camel_sasl_digest_md5_class_init (CamelSaslDigestMd5Class *class)
 {
 	GObjectClass *object_class;
 	CamelSaslClass *sasl_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelSaslDigestMd5Private));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -934,25 +933,8 @@ sasl_digest_md5_class_init (CamelSaslDigestMd5Class *class)
 }
 
 static void
-sasl_digest_md5_init (CamelSaslDigestMd5 *sasl)
+camel_sasl_digest_md5_init (CamelSaslDigestMd5 *sasl)
 {
 	sasl->priv = CAMEL_SASL_DIGEST_MD5_GET_PRIVATE (sasl);
 }
 
-GType
-camel_sasl_digest_md5_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_SASL,
-			"CamelSaslDigestMd5",
-			sizeof (CamelSaslDigestMd5Class),
-			(GClassInitFunc) sasl_digest_md5_class_init,
-			sizeof (CamelSaslDigestMd5),
-			(GInstanceInitFunc) sasl_digest_md5_init,
-			0);
-
-	return type;
-}
diff --git a/camel/camel-sasl-gssapi.c b/camel/camel-sasl-gssapi.c
index 306c714..b17f913 100644
--- a/camel/camel-sasl-gssapi.c
+++ b/camel/camel-sasl-gssapi.c
@@ -101,7 +101,7 @@ struct _CamelSaslGssapiPrivate {
 	gss_name_t target;
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelSaslGssapi, camel_sasl_gssapi, CAMEL_TYPE_SASL)
 
 static void
 gssapi_set_exception (OM_uint32 major,
@@ -176,7 +176,7 @@ sasl_gssapi_finalize (GObject *object)
 		gss_release_name (&status, &sasl->priv->target);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_sasl_gssapi_parent_class)->finalize (object);
 }
 
 /* DBUS Specific code */
@@ -411,12 +411,11 @@ sasl_gssapi_challenge (CamelSasl *sasl,
 }
 
 static void
-sasl_gssapi_class_init (CamelSaslGssapiClass *class)
+camel_sasl_gssapi_class_init (CamelSaslGssapiClass *class)
 {
 	GObjectClass *object_class;
 	CamelSaslClass *sasl_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelSaslGssapiPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -427,7 +426,7 @@ sasl_gssapi_class_init (CamelSaslGssapiClass *class)
 }
 
 static void
-sasl_gssapi_init (CamelSaslGssapi *sasl)
+camel_sasl_gssapi_init (CamelSaslGssapi *sasl)
 {
 	sasl->priv = CAMEL_SASL_GSSAPI_GET_PRIVATE (sasl);
 
@@ -436,22 +435,4 @@ sasl_gssapi_init (CamelSaslGssapi *sasl)
 	sasl->priv->target = GSS_C_NO_NAME;
 }
 
-GType
-camel_sasl_gssapi_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_SASL,
-			"CamelSaslGssapi",
-			sizeof (CamelSaslGssapiClass),
-			(GClassInitFunc) sasl_gssapi_class_init,
-			sizeof (CamelSaslGssapi),
-			(GInstanceInitFunc) sasl_gssapi_init,
-			0);
-
-	return type;
-}
-
 #endif /* HAVE_KRB5 */
diff --git a/camel/camel-sasl-login.c b/camel/camel-sasl-login.c
index fc26faf..ad5e349 100644
--- a/camel/camel-sasl-login.c
+++ b/camel/camel-sasl-login.c
@@ -54,7 +54,7 @@ struct _CamelSaslLoginPrivate {
 	gint state;
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelSaslLogin, camel_sasl_login, CAMEL_TYPE_SASL)
 
 static GByteArray *
 sasl_login_challenge (CamelSasl *sasl,
@@ -100,11 +100,10 @@ sasl_login_challenge (CamelSasl *sasl,
 }
 
 static void
-sasl_login_class_init (CamelSaslLoginClass *class)
+camel_sasl_login_class_init (CamelSaslLoginClass *class)
 {
 	CamelSaslClass *sasl_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelSaslLoginPrivate));
 
 	sasl_class = CAMEL_SASL_CLASS (class);
@@ -112,25 +111,8 @@ sasl_login_class_init (CamelSaslLoginClass *class)
 }
 
 static void
-sasl_login_init (CamelSaslLogin *sasl)
+camel_sasl_login_init (CamelSaslLogin *sasl)
 {
 	sasl->priv = CAMEL_SASL_LOGIN_GET_PRIVATE (sasl);
 }
 
-GType
-camel_sasl_login_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_SASL,
-			"CamelSaslLogin",
-			sizeof (CamelSaslLoginClass),
-			(GClassInitFunc) sasl_login_class_init,
-			sizeof (CamelSaslLogin),
-			(GInstanceInitFunc) sasl_login_init,
-			0);
-
-	return type;
-}
diff --git a/camel/camel-sasl-ntlm.c b/camel/camel-sasl-ntlm.c
index 1d5829b..6aa427d 100644
--- a/camel/camel-sasl-ntlm.c
+++ b/camel/camel-sasl-ntlm.c
@@ -47,7 +47,7 @@ CamelServiceAuthType camel_sasl_ntlm_authtype = {
 	TRUE
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelSaslNTLM, camel_sasl_ntlm, CAMEL_TYPE_SASL)
 
 #define NTLM_REQUEST "NTLMSSP\x00\x01\x00\x00\x00\x06\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x30\x00\x00\x00\x00\x00\x00\x00\x30\x00\x00\x00"
 
@@ -722,11 +722,10 @@ exit:
 }
 
 static void
-sasl_ntlm_class_init (CamelSaslNTLMClass *class)
+camel_sasl_ntlm_class_init (CamelSaslNTLMClass *class)
 {
 	CamelSaslClass *sasl_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelSaslNTLMPrivate));
 
 	sasl_class = CAMEL_SASL_CLASS (class);
@@ -734,26 +733,8 @@ sasl_ntlm_class_init (CamelSaslNTLMClass *class)
 }
 
 static void
-sasl_ntlm_init (CamelSaslNTLM *sasl)
+camel_sasl_ntlm_init (CamelSaslNTLM *sasl)
 {
 	sasl->priv = CAMEL_SASL_NTLM_GET_PRIVATE (sasl);
 }
 
-GType
-camel_sasl_ntlm_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_SASL,
-			"CamelSaslNTLM",
-			sizeof (CamelSaslNTLMClass),
-			(GClassInitFunc) sasl_ntlm_class_init,
-			sizeof (CamelSaslNTLM),
-			(GInstanceInitFunc) sasl_ntlm_init,
-			0);
-
-	return type;
-}
-
diff --git a/camel/camel-sasl-plain.c b/camel/camel-sasl-plain.c
index e282264..93232ed 100644
--- a/camel/camel-sasl-plain.c
+++ b/camel/camel-sasl-plain.c
@@ -49,7 +49,7 @@ CamelServiceAuthType camel_sasl_plain_authtype = {
 	TRUE
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelSaslPlain, camel_sasl_plain, CAMEL_TYPE_SASL)
 
 static GByteArray *
 sasl_plain_challenge (CamelSasl *sasl,
@@ -77,11 +77,10 @@ sasl_plain_challenge (CamelSasl *sasl,
 }
 
 static void
-sasl_plain_class_init (CamelSaslPlainClass *class)
+camel_sasl_plain_class_init (CamelSaslPlainClass *class)
 {
 	CamelSaslClass *sasl_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelSaslPlainPrivate));
 
 	sasl_class = CAMEL_SASL_CLASS (class);
@@ -89,25 +88,8 @@ sasl_plain_class_init (CamelSaslPlainClass *class)
 }
 
 static void
-sasl_plain_init (CamelSaslPlain *sasl)
+camel_sasl_plain_init (CamelSaslPlain *sasl)
 {
 	sasl->priv = CAMEL_SASL_PLAIN_GET_PRIVATE (sasl);
 }
 
-GType
-camel_sasl_plain_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_SASL,
-			"CamelSaslPlain",
-			sizeof (CamelSaslPlainClass),
-			(GClassInitFunc) sasl_plain_class_init,
-			sizeof (CamelSaslPlain),
-			(GInstanceInitFunc) sasl_plain_init,
-			0);
-
-	return type;
-}
diff --git a/camel/camel-sasl-popb4smtp.c b/camel/camel-sasl-popb4smtp.c
index 2bff5ce..931f323 100644
--- a/camel/camel-sasl-popb4smtp.c
+++ b/camel/camel-sasl-popb4smtp.c
@@ -62,7 +62,7 @@ static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
 #define POPB4SMTP_LOCK(l) pthread_mutex_lock(&l)
 #define POPB4SMTP_UNLOCK(l) pthread_mutex_unlock(&l)
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelSaslPOPB4SMTP, camel_sasl_popb4smtp, CAMEL_TYPE_SASL)
 
 static GByteArray *
 sasl_popb4smtp_challenge (CamelSasl *sasl,
@@ -137,11 +137,10 @@ sasl_popb4smtp_challenge (CamelSasl *sasl,
 }
 
 static void
-sasl_popb4smtp_class_init (CamelSaslPOPB4SMTPClass *class)
+camel_sasl_popb4smtp_class_init (CamelSaslPOPB4SMTPClass *class)
 {
 	CamelSaslClass *sasl_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelSaslPOPB4SMTPPrivate));
 
 	sasl_class = CAMEL_SASL_CLASS (class);
@@ -151,26 +150,8 @@ sasl_popb4smtp_class_init (CamelSaslPOPB4SMTPClass *class)
 }
 
 static void
-sasl_popb4smtp_init (CamelSaslPOPB4SMTP *sasl)
+camel_sasl_popb4smtp_init (CamelSaslPOPB4SMTP *sasl)
 {
 	sasl->priv = CAMEL_SASL_POPB4SMTP_GET_PRIVATE (sasl);
 }
 
-GType
-camel_sasl_popb4smtp_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_SASL,
-			"CamelSaslPOPB4SMTP",
-			sizeof (CamelSaslPOPB4SMTPClass),
-			(GClassInitFunc) sasl_popb4smtp_class_init,
-			sizeof (CamelSaslPOPB4SMTP),
-			(GInstanceInitFunc) sasl_popb4smtp_init,
-			0);
-
-	return type;
-}
-
diff --git a/camel/camel-sasl.c b/camel/camel-sasl.c
index 224496f..bf1089c 100644
--- a/camel/camel-sasl.c
+++ b/camel/camel-sasl.c
@@ -58,7 +58,7 @@ enum {
 	PROP_SERVICE_NAME
 };
 
-static gpointer parent_class;
+G_DEFINE_ABSTRACT_TYPE (CamelSasl, camel_sasl, CAMEL_TYPE_OBJECT)
 
 static void
 sasl_set_mechanism (CamelSasl *sasl,
@@ -173,7 +173,7 @@ sasl_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_sasl_parent_class)->dispose (object);
 }
 
 static void
@@ -187,15 +187,14 @@ sasl_finalize (GObject *object)
 	g_free (priv->service_name);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_sasl_parent_class)->finalize (object);
 }
 
 static void
-sasl_class_init (CamelSaslClass *class)
+camel_sasl_class_init (CamelSaslClass *class)
 {
 	GObjectClass *object_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelSaslPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -249,29 +248,11 @@ sasl_class_init (CamelSaslClass *class)
 }
 
 static void
-sasl_init (CamelSasl *sasl)
+camel_sasl_init (CamelSasl *sasl)
 {
 	sasl->priv = CAMEL_SASL_GET_PRIVATE (sasl);
 }
 
-GType
-camel_sasl_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OBJECT,
-			"CamelSasl",
-			sizeof (CamelSaslClass),
-			(GClassInitFunc) sasl_class_init,
-			sizeof (CamelSasl),
-			(GInstanceInitFunc) sasl_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_sasl_challenge:
  * @sasl: a #CamelSasl object
diff --git a/camel/camel-seekable-stream.c b/camel/camel-seekable-stream.c
index d956d1b..0ab658c 100644
--- a/camel/camel-seekable-stream.c
+++ b/camel/camel-seekable-stream.c
@@ -27,7 +27,7 @@
 
 #include "camel-seekable-stream.h"
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelSeekableStream, camel_seekable_stream, CAMEL_TYPE_STREAM)
 
 static gint
 seekable_stream_reset (CamelStream *stream,
@@ -66,12 +66,10 @@ seekable_stream_set_bounds (CamelSeekableStream *stream,
 }
 
 static void
-seekable_stream_class_init (CamelSeekableStreamClass *class)
+camel_seekable_stream_class_init (CamelSeekableStreamClass *class)
 {
 	CamelStreamClass *stream_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	stream_class = CAMEL_STREAM_CLASS (class);
 	stream_class->reset = seekable_stream_reset;
 
@@ -80,30 +78,12 @@ seekable_stream_class_init (CamelSeekableStreamClass *class)
 }
 
 static void
-seekable_stream_init (CamelSeekableStream *stream)
+camel_seekable_stream_init (CamelSeekableStream *stream)
 {
 	stream->bound_start = 0;
 	stream->bound_end = CAMEL_STREAM_UNBOUND;
 }
 
-GType
-camel_seekable_stream_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_STREAM,
-			"CamelSeekableStream",
-			sizeof (CamelSeekableStreamClass),
-			(GClassInitFunc) seekable_stream_class_init,
-			sizeof (CamelSeekableStream),
-			(GInstanceInitFunc) seekable_stream_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_seekable_stream_seek:
  * @stream: a #CamelStream object
diff --git a/camel/camel-seekable-substream.c b/camel/camel-seekable-substream.c
index a6ec79c..0007ff4 100644
--- a/camel/camel-seekable-substream.c
+++ b/camel/camel-seekable-substream.c
@@ -27,7 +27,7 @@
 
 #include "camel-seekable-substream.h"
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelSeekableSubstream, camel_seekable_substream, CAMEL_TYPE_SEEKABLE_STREAM)
 
 static gboolean
 seekable_substream_parent_reset (CamelSeekableSubstream *seekable_substream,
@@ -56,7 +56,7 @@ seekable_substream_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_seekable_substream_parent_class)->dispose (object);
 }
 
 static gssize
@@ -233,14 +233,12 @@ seekable_substream_seek (CamelSeekableStream *seekable_stream,
 }
 
 static void
-seekable_substream_class_init (CamelSeekableSubstreamClass *class)
+camel_seekable_substream_class_init (CamelSeekableSubstreamClass *class)
 {
 	GObjectClass *object_class;
 	CamelStreamClass *stream_class;
 	CamelSeekableStreamClass *seekable_stream_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->dispose = seekable_substream_dispose;
 
@@ -253,25 +251,11 @@ seekable_substream_class_init (CamelSeekableSubstreamClass *class)
 
 	seekable_stream_class = CAMEL_SEEKABLE_STREAM_CLASS (class);
 	seekable_stream_class->seek = seekable_substream_seek;
-
 }
 
-GType
-camel_seekable_substream_get_type (void)
+static void
+camel_seekable_substream_init (CamelSeekableSubstream *seekable_substream)
 {
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_SEEKABLE_STREAM,
-			"CamelSeekableSubstream",
-			sizeof (CamelSeekableSubstreamClass),
-			(GClassInitFunc) seekable_substream_class_init,
-			sizeof (CamelSeekableSubstream),
-			(GInstanceInitFunc) NULL,
-			0);
-
-	return type;
 }
 
 /**
diff --git a/camel/camel-service.c b/camel/camel-service.c
index 5686dc8..743a757 100644
--- a/camel/camel-service.c
+++ b/camel/camel-service.c
@@ -47,7 +47,7 @@
 	(G_TYPE_INSTANCE_GET_PRIVATE \
 	((obj), CAMEL_TYPE_SERVICE, CamelServicePrivate))
 
-static gpointer parent_class;
+G_DEFINE_ABSTRACT_TYPE (CamelService, camel_service, CAMEL_TYPE_OBJECT)
 
 static void
 service_finalize (GObject *object)
@@ -67,7 +67,7 @@ service_finalize (GObject *object)
 	g_static_mutex_free (&service->priv->connect_op_lock);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_service_parent_class)->finalize (object);
 }
 
 static gint
@@ -136,7 +136,7 @@ service_setv (CamelObject *object,
 	}
 
 	/* Chain up to parent's setv() method. */
-	return CAMEL_OBJECT_CLASS (parent_class)->setv (object, error, args);
+	return CAMEL_OBJECT_CLASS (camel_service_parent_class)->setv (object, error, args);
 }
 
 static gint
@@ -185,7 +185,7 @@ service_getv (CamelObject *object,
 	}
 
 	/* Chain up to parent's getv() method. */
-	return CAMEL_OBJECT_CLASS (parent_class)->getv (object, error, args);
+	return CAMEL_OBJECT_CLASS (camel_service_parent_class)->getv (object, error, args);
 }
 
 static gboolean
@@ -318,12 +318,11 @@ service_get_path (CamelService *service)
 }
 
 static void
-service_class_init (CamelServiceClass *class)
+camel_service_class_init (CamelServiceClass *class)
 {
 	GObjectClass *object_class;
 	CamelObjectClass *camel_object_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelServicePrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -343,7 +342,7 @@ service_class_init (CamelServiceClass *class)
 }
 
 static void
-service_init (CamelService *service)
+camel_service_init (CamelService *service)
 {
 	service->priv = CAMEL_SERVICE_GET_PRIVATE (service);
 
@@ -351,24 +350,6 @@ service_init (CamelService *service)
 	g_static_mutex_init (&service->priv->connect_op_lock);
 }
 
-GType
-camel_service_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OBJECT,
-			"CamelService",
-			sizeof (CamelServiceClass),
-			(GClassInitFunc) service_class_init,
-			sizeof (CamelService),
-			(GInstanceInitFunc) service_init,
-			0);
-
-	return type;
-}
-
 GQuark
 camel_service_error_quark (void)
 {
diff --git a/camel/camel-session.c b/camel/camel-session.c
index ca20dc9..2c5139b 100644
--- a/camel/camel-session.c
+++ b/camel/camel-session.c
@@ -55,7 +55,7 @@
 	(G_TYPE_INSTANCE_GET_PRIVATE \
 	((obj), CAMEL_TYPE_SESSION, CamelSessionPrivate))
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelSession, camel_session, CAMEL_TYPE_OBJECT)
 
 static void
 cs_thread_status (CamelOperation *op,
@@ -97,7 +97,7 @@ session_finalize (GObject *object)
 	}
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_session_parent_class)->finalize (object);
 }
 
 static CamelService *
@@ -295,12 +295,11 @@ session_thread_status (CamelSession *session,
 }
 
 static void
-session_class_init (CamelSessionClass *class)
+camel_session_class_init (CamelSessionClass *class)
 {
 	GObjectClass *object_class;
 	CamelObjectClass *camel_object_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelSessionPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -319,7 +318,7 @@ session_class_init (CamelSessionClass *class)
 }
 
 static void
-session_init (CamelSession *session)
+camel_session_init (CamelSession *session)
 {
 	session->priv = CAMEL_SESSION_GET_PRIVATE (session);
 
@@ -334,24 +333,6 @@ session_init (CamelSession *session)
 	session->priv->junk_headers = NULL;
 }
 
-GType
-camel_session_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OBJECT,
-			"CamelSession",
-			sizeof (CamelSessionClass),
-			(GClassInitFunc) session_class_init,
-			sizeof (CamelSession),
-			(GInstanceInitFunc) session_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_session_construct:
  * @session: a #CamelSession object to construct
diff --git a/camel/camel-smime-context.c b/camel/camel-smime-context.c
index f24361e..f5fef01 100644
--- a/camel/camel-smime-context.c
+++ b/camel/camel-smime-context.c
@@ -75,7 +75,7 @@ struct _CamelSMIMEContextPrivate {
 	guint send_encrypt_key_prefs:1;
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelSMIMEContext, camel_smime_context, CAMEL_TYPE_CIPHER_CONTEXT)
 
 /* used for decode content callback, for streaming decode */
 static void
@@ -1164,11 +1164,10 @@ fail:
 }
 
 static void
-smime_context_class_init (CamelSMIMEContextClass *class)
+camel_smime_context_class_init (CamelSMIMEContextClass *class)
 {
 	CamelCipherContextClass *cipher_context_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelSMIMEContextPrivate));
 
 	cipher_context_class = CAMEL_CIPHER_CONTEXT_CLASS (class);
@@ -1184,7 +1183,7 @@ smime_context_class_init (CamelSMIMEContextClass *class)
 }
 
 static void
-smime_context_init (CamelSMIMEContext *smime_context)
+camel_smime_context_init (CamelSMIMEContext *smime_context)
 {
 	smime_context->priv = CAMEL_SMIME_CONTEXT_GET_PRIVATE (smime_context);
 
@@ -1193,24 +1192,6 @@ smime_context_init (CamelSMIMEContext *smime_context)
 	smime_context->priv->password_tries = 0;
 }
 
-GType
-camel_smime_context_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_CIPHER_CONTEXT,
-			"CamelSMIMEContext",
-			sizeof (CamelSMIMEContextClass),
-			(GClassInitFunc) smime_context_class_init,
-			sizeof (CamelSMIMEContext),
-			(GInstanceInitFunc) smime_context_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_smime_context_new:
  * @session: session
diff --git a/camel/camel-store-summary.c b/camel/camel-store-summary.c
index 5a5b0a6..ccea39a 100644
--- a/camel/camel-store-summary.c
+++ b/camel/camel-store-summary.c
@@ -55,7 +55,7 @@
 	(G_TYPE_INSTANCE_GET_PRIVATE \
 	((obj), CAMEL_TYPE_STORE_SUMMARY, CamelStoreSummaryPrivate))
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelStoreSummary, camel_store_summary, CAMEL_TYPE_OBJECT)
 
 static void
 store_summary_finalize (GObject *object)
@@ -77,7 +77,7 @@ store_summary_finalize (GObject *object)
 	g_mutex_free (summary->priv->ref_lock);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_store_summary_parent_class)->finalize (object);
 }
 
 static gint
@@ -290,11 +290,10 @@ store_summary_store_info_set_string (CamelStoreSummary *summary,
 }
 
 static void
-store_summary_class_init (CamelStoreSummaryClass *class)
+camel_store_summary_class_init (CamelStoreSummaryClass *class)
 {
 	GObjectClass *object_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelStoreSummaryPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -311,7 +310,7 @@ store_summary_class_init (CamelStoreSummaryClass *class)
 }
 
 static void
-store_summary_init (CamelStoreSummary *summary)
+camel_store_summary_init (CamelStoreSummary *summary)
 {
 	summary->priv = CAMEL_STORE_SUMMARY_GET_PRIVATE (summary);
 
@@ -333,24 +332,6 @@ store_summary_init (CamelStoreSummary *summary)
 	summary->priv->ref_lock = g_mutex_new ();
 }
 
-GType
-camel_store_summary_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OBJECT,
-			"CamelStoreSummary",
-			sizeof (CamelStoreSummaryClass),
-			(GClassInitFunc) store_summary_class_init,
-			sizeof (CamelStoreSummary),
-			(GInstanceInitFunc) store_summary_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_store_summary_new:
  *
diff --git a/camel/camel-store.c b/camel/camel-store.c
index c90a76e..b75fd32 100644
--- a/camel/camel-store.c
+++ b/camel/camel-store.c
@@ -48,7 +48,7 @@
 	(G_TYPE_INSTANCE_GET_PRIVATE \
 	((obj), CAMEL_TYPE_STORE, CamelStorePrivate))
 
-static gpointer parent_class;
+G_DEFINE_ABSTRACT_TYPE (CamelStore, camel_store, CAMEL_TYPE_SERVICE)
 
 /**
  * ignore_no_such_table_exception:
@@ -105,7 +105,25 @@ store_finalize (GObject *object)
 	}
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_store_parent_class)->finalize (object);
+}
+
+static void
+store_constructed (GObject *object)
+{
+	CamelStore *store;
+	CamelStoreClass *class;
+
+	store = CAMEL_STORE (object);
+	class = CAMEL_STORE_GET_CLASS (store);
+
+	if (class->hash_folder_name != NULL)
+		store->folders = camel_object_bag_new (
+			class->hash_folder_name,
+			class->compare_folder_name,
+			(CamelCopyFunc) g_strdup, g_free);
+	else
+		store->folders = NULL;
 }
 
 static gboolean
@@ -120,7 +138,7 @@ store_construct (CamelService *service,
 	gchar *store_db_path, *store_path = NULL;
 
 	/* Chain up to parent's construct() method. */
-	service_class = CAMEL_SERVICE_CLASS (parent_class);
+	service_class = CAMEL_SERVICE_CLASS (camel_store_parent_class);
 	if (!service_class->construct (service, session, provider, url, error))
 		return FALSE;
 
@@ -258,17 +276,17 @@ store_can_refresh_folder (CamelStore *store,
 }
 
 static void
-store_class_init (CamelStoreClass *class)
+camel_store_class_init (CamelStoreClass *class)
 {
 	GObjectClass *object_class;
 	CamelObjectClass *camel_object_class;
 	CamelServiceClass *service_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelStorePrivate));
 
 	object_class = G_OBJECT_CLASS (class);
 	object_class->finalize = store_finalize;
+	object_class->constructed = store_constructed;
 
 	service_class = CAMEL_SERVICE_CLASS (class);
 	service_class->construct = store_construct;
@@ -292,18 +310,10 @@ store_class_init (CamelStoreClass *class)
 }
 
 static void
-store_init (CamelStore *store,
-            CamelStoreClass *store_class)
+camel_store_init (CamelStore *store)
 {
 	store->priv = CAMEL_STORE_GET_PRIVATE (store);
 
-	if (store_class->hash_folder_name) {
-		store->folders = camel_object_bag_new(store_class->hash_folder_name,
-						      store_class->compare_folder_name,
-						      (CamelCopyFunc)g_strdup, g_free);
-	} else
-		store->folders = NULL;
-
 	/* set vtrash and vjunk on by default */
 	store->flags = CAMEL_STORE_VTRASH | CAMEL_STORE_VJUNK;
 	store->mode = CAMEL_STORE_READ | CAMEL_STORE_WRITE;
@@ -311,24 +321,6 @@ store_init (CamelStore *store,
 	g_static_rec_mutex_init (&store->priv->folder_lock);
 }
 
-GType
-camel_store_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_SERVICE,
-			"CamelStore",
-			sizeof (CamelStoreClass),
-			(GClassInitFunc) store_class_init,
-			sizeof (CamelStore),
-			(GInstanceInitFunc) store_init,
-			0);
-
-	return type;
-}
-
 GQuark
 camel_store_error_quark (void)
 {
diff --git a/camel/camel-stream-buffer.c b/camel/camel-stream-buffer.c
index 3752a32..56ce5ec 100644
--- a/camel/camel-stream-buffer.c
+++ b/camel/camel-stream-buffer.c
@@ -51,7 +51,7 @@ struct _CamelStreamBufferPrivate {
 	guint flags;
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelStreamBuffer, camel_stream_buffer, CAMEL_TYPE_STREAM)
 
 enum {
 	BUF_USER = 1<<0	/* user-supplied buffer, do not free */
@@ -119,7 +119,7 @@ stream_buffer_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_stream_buffer_parent_class)->dispose (object);
 }
 
 static void
@@ -135,7 +135,7 @@ stream_buffer_finalize (GObject *object)
 	g_free (priv->linebuf);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_stream_buffer_parent_class)->finalize (object);
 }
 
 static gssize
@@ -322,12 +322,11 @@ stream_buffer_init_method (CamelStreamBuffer *stream,
 }
 
 static void
-stream_buffer_class_init (CamelStreamBufferClass *class)
+camel_stream_buffer_class_init (CamelStreamBufferClass *class)
 {
 	GObjectClass *object_class;
 	CamelStreamClass *stream_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelStreamBufferPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -346,7 +345,7 @@ stream_buffer_class_init (CamelStreamBufferClass *class)
 }
 
 static void
-stream_buffer_init (CamelStreamBuffer *stream)
+camel_stream_buffer_init (CamelStreamBuffer *stream)
 {
 	stream->priv = CAMEL_STREAM_BUFFER_GET_PRIVATE (stream);
 
@@ -363,24 +362,6 @@ stream_buffer_init (CamelStreamBuffer *stream)
 	stream->priv->linebuf = g_malloc (stream->priv->linesize);
 }
 
-GType
-camel_stream_buffer_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_STREAM,
-			"CamelStreamBuffer",
-			sizeof (CamelStreamBufferClass),
-			(GClassInitFunc) stream_buffer_class_init,
-			sizeof (CamelStreamBuffer),
-			(GInstanceInitFunc) stream_buffer_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_stream_buffer_new:
  * @stream: a #CamelStream object to buffer
diff --git a/camel/camel-stream-filter.c b/camel/camel-stream-filter.c
index d5b6cec..aee3d71 100644
--- a/camel/camel-stream-filter.c
+++ b/camel/camel-stream-filter.c
@@ -64,7 +64,7 @@ struct _CamelStreamFilterPrivate {
 #define READ_PAD (128)		/* bytes padded before buffer */
 #define READ_SIZE (4096)
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelStreamFilter, camel_stream_filter, CAMEL_TYPE_STREAM)
 
 static void
 stream_filter_finalize (GObject *object)
@@ -84,7 +84,7 @@ stream_filter_finalize (GObject *object)
 	g_object_unref (stream->priv->source);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_stream_filter_parent_class)->finalize (object);
 }
 
 static gssize
@@ -306,12 +306,11 @@ stream_filter_reset (CamelStream *stream,
 }
 
 static void
-stream_filter_class_init (CamelStreamFilterClass *class)
+camel_stream_filter_class_init (CamelStreamFilterClass *class)
 {
 	GObjectClass *object_class;
 	CamelStreamClass *stream_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelStreamFilterPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -328,7 +327,7 @@ stream_filter_class_init (CamelStreamFilterClass *class)
 }
 
 static void
-stream_filter_init (CamelStreamFilter *stream)
+camel_stream_filter_init (CamelStreamFilter *stream)
 {
 	stream->priv = CAMEL_STREAM_FILTER_GET_PRIVATE (stream);
 
@@ -338,24 +337,6 @@ stream_filter_init (CamelStreamFilter *stream)
 	stream->priv->flushed = FALSE;
 }
 
-GType
-camel_stream_filter_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_STREAM,
-			"CamelStreamFilter",
-			sizeof (CamelStreamFilterClass),
-			(GClassInitFunc) stream_filter_class_init,
-			sizeof (CamelStreamFilter),
-			(GInstanceInitFunc) stream_filter_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_stream_filter_new:
  *
diff --git a/camel/camel-stream-fs.c b/camel/camel-stream-fs.c
index efb5cd1..cacf5a4 100644
--- a/camel/camel-stream-fs.c
+++ b/camel/camel-stream-fs.c
@@ -48,7 +48,7 @@ struct _CamelStreamFsPrivate {
 	gint fd;	/* file descriptor on the underlying file */
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelStreamFs, camel_stream_fs, CAMEL_TYPE_SEEKABLE_STREAM)
 
 static void
 stream_fs_finalize (GObject *object)
@@ -61,7 +61,7 @@ stream_fs_finalize (GObject *object)
 		close (priv->fd);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_stream_fs_parent_class)->finalize (object);
 }
 
 static gssize
@@ -209,13 +209,12 @@ stream_fs_seek (CamelSeekableStream *stream,
 }
 
 static void
-stream_fs_class_init (CamelStreamFsClass *class)
+camel_stream_fs_class_init (CamelStreamFsClass *class)
 {
 	GObjectClass *object_class;
 	CamelStreamClass *stream_class;
 	CamelSeekableStreamClass *seekable_stream_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelStreamFsPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -232,7 +231,7 @@ stream_fs_class_init (CamelStreamFsClass *class)
 }
 
 static void
-stream_fs_init (CamelStreamFs *stream)
+camel_stream_fs_init (CamelStreamFs *stream)
 {
 	stream->priv = CAMEL_STREAM_FS_GET_PRIVATE (stream);
 	stream->priv->fd = -1;
@@ -240,24 +239,6 @@ stream_fs_init (CamelStreamFs *stream)
 	CAMEL_SEEKABLE_STREAM (stream)->bound_end = CAMEL_STREAM_UNBOUND;
 }
 
-GType
-camel_stream_fs_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_SEEKABLE_STREAM,
-			"CamelStreamFs",
-			sizeof (CamelStreamFsClass),
-			(GClassInitFunc) stream_fs_class_init,
-			sizeof (CamelStreamFs),
-			(GInstanceInitFunc) stream_fs_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_stream_fs_new_with_fd:
  * @fd: a file descriptor
diff --git a/camel/camel-stream-mem.c b/camel/camel-stream-mem.c
index c98ada5..607ee91 100644
--- a/camel/camel-stream-mem.c
+++ b/camel/camel-stream-mem.c
@@ -46,7 +46,7 @@ struct _CamelStreamMemPrivate {
 	GByteArray *buffer;
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelStreamMem, camel_stream_mem, CAMEL_TYPE_SEEKABLE_STREAM)
 
 /* could probably be a util method */
 static void
@@ -82,7 +82,7 @@ stream_mem_finalize (GObject *object)
 	}
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_stream_mem_parent_class)->finalize (object);
 }
 
 static gssize
@@ -194,13 +194,12 @@ stream_mem_seek (CamelSeekableStream *stream,
 }
 
 static void
-stream_mem_class_init (CamelStreamMemClass *class)
+camel_stream_mem_class_init (CamelStreamMemClass *class)
 {
 	GObjectClass *object_class;
 	CamelStreamClass *stream_class;
 	CamelSeekableStreamClass *seekable_stream_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelStreamMemPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -216,29 +215,11 @@ stream_mem_class_init (CamelStreamMemClass *class)
 }
 
 static void
-stream_mem_init (CamelStreamMem *stream)
+camel_stream_mem_init (CamelStreamMem *stream)
 {
 	stream->priv = CAMEL_STREAM_MEM_GET_PRIVATE (stream);
 }
 
-GType
-camel_stream_mem_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_SEEKABLE_STREAM,
-			"CamelStreamMem",
-			sizeof (CamelStreamMemClass),
-			(GClassInitFunc) stream_mem_class_init,
-			sizeof (CamelStreamMem),
-			(GInstanceInitFunc) stream_mem_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_stream_mem_new:
  *
diff --git a/camel/camel-stream-null.c b/camel/camel-stream-null.c
index e495fea..d94f921 100644
--- a/camel/camel-stream-null.c
+++ b/camel/camel-stream-null.c
@@ -28,7 +28,7 @@
 
 #include "camel-stream-null.h"
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelStreamNull, camel_stream_null, CAMEL_TYPE_STREAM)
 
 static gssize
 stream_null_write (CamelStream *stream,
@@ -57,34 +57,19 @@ stream_null_reset (CamelStream *stream,
 }
 
 static void
-stream_null_class_init (CamelStreamClass *class)
+camel_stream_null_class_init (CamelStreamNullClass *class)
 {
 	CamelStreamClass *stream_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	stream_class = CAMEL_STREAM_CLASS (class);
 	stream_class->write = stream_null_write;
 	stream_class->eos = stream_null_eos;
 	stream_class->reset = stream_null_reset;
 }
 
-GType
-camel_stream_null_get_type (void)
+static void
+camel_stream_null_init (CamelStreamNull *stream_null)
 {
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_STREAM,
-			"CamelStreamNull",
-			sizeof (CamelStreamNullClass),
-			(GClassInitFunc) stream_null_class_init,
-			sizeof (CamelStreamNull),
-			(GInstanceInitFunc) NULL,
-			0);
-
-	return type;
 }
 
 /**
diff --git a/camel/camel-stream-process.c b/camel/camel-stream-process.c
index 9a54210..c88c2f8 100644
--- a/camel/camel-stream-process.c
+++ b/camel/camel-stream-process.c
@@ -44,7 +44,7 @@
 
 extern gint camel_verbose_debug;
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelStreamProcess, camel_stream_process, CAMEL_TYPE_STREAM)
 
 static void
 stream_process_finalize (GObject *object)
@@ -54,7 +54,7 @@ stream_process_finalize (GObject *object)
 	camel_stream_close (CAMEL_STREAM (object), NULL);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_stream_process_parent_class)->finalize (object);
 }
 
 static gssize
@@ -137,13 +137,11 @@ stream_process_flush (CamelStream *stream,
 }
 
 static void
-stream_process_class_init (CamelStreamProcessClass *class)
+camel_stream_process_class_init (CamelStreamProcessClass *class)
 {
 	GObjectClass *object_class;
 	CamelStreamClass *stream_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->finalize = stream_process_finalize;
 
@@ -155,30 +153,12 @@ stream_process_class_init (CamelStreamProcessClass *class)
 }
 
 static void
-stream_process_init (CamelStreamProcess *stream)
+camel_stream_process_init (CamelStreamProcess *stream)
 {
 	stream->sockfd = -1;
 	stream->childpid = 0;
 }
 
-GType
-camel_stream_process_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_STREAM,
-			"CamelStreamProcess",
-			sizeof (CamelStreamProcessClass),
-			(GClassInitFunc) stream_process_class_init,
-			sizeof (CamelStreamProcess),
-			(GInstanceInitFunc) stream_process_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_stream_process_new:
  *
diff --git a/camel/camel-stream-vfs.c b/camel/camel-stream-vfs.c
index 483b575..cdebe05 100644
--- a/camel/camel-stream-vfs.c
+++ b/camel/camel-stream-vfs.c
@@ -35,7 +35,7 @@
 #include "camel-private.h"
 #include "camel-stream-vfs.h"
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelStreamVFS, camel_stream_vfs, CAMEL_TYPE_STREAM)
 
 static void
 stream_vfs_dispose (GObject *object)
@@ -48,7 +48,7 @@ stream_vfs_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_stream_vfs_parent_class)->dispose (object);
 }
 
 static gssize
@@ -123,13 +123,11 @@ stream_vfs_close (CamelStream *stream,
 }
 
 static void
-stream_vfs_class_init (CamelStreamVFSClass *class)
+camel_stream_vfs_class_init (CamelStreamVFSClass *class)
 {
 	GObjectClass *object_class;
 	CamelStreamClass *stream_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->dispose = stream_vfs_dispose;
 
@@ -141,29 +139,11 @@ stream_vfs_class_init (CamelStreamVFSClass *class)
 }
 
 static void
-stream_vfs_init (CamelStreamVFS *stream)
+camel_stream_vfs_init (CamelStreamVFS *stream)
 {
 	stream->stream = NULL;
 }
 
-GType
-camel_stream_vfs_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_STREAM,
-			"CamelStreamVFS",
-			sizeof (CamelStreamVFSClass),
-			(GClassInitFunc) stream_vfs_class_init,
-			sizeof (CamelStreamVFS),
-			(GInstanceInitFunc) stream_vfs_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_stream_vfs_new_with_stream:
  * @stream: a GInputStream or GOutputStream instance
diff --git a/camel/camel-stream.c b/camel/camel-stream.c
index 14b2a21..a422956 100644
--- a/camel/camel-stream.c
+++ b/camel/camel-stream.c
@@ -30,7 +30,7 @@
 
 #include "camel-stream.h"
 
-static gpointer parent_class;
+G_DEFINE_ABSTRACT_TYPE (CamelStream, camel_stream, CAMEL_TYPE_OBJECT)
 
 static gssize
 stream_read (CamelStream *stream,
@@ -78,10 +78,8 @@ stream_reset (CamelStream *stream,
 }
 
 static void
-stream_class_init (CamelStreamClass *class)
+camel_stream_class_init (CamelStreamClass *class)
 {
-	parent_class = g_type_class_peek_parent (class);
-
 	class->read = stream_read;
 	class->write = stream_write;
 	class->close = stream_close;
@@ -90,22 +88,9 @@ stream_class_init (CamelStreamClass *class)
 	class->reset = stream_reset;
 }
 
-GType
-camel_stream_get_type (void)
+static void
+camel_stream_init (CamelStream *stream)
 {
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OBJECT,
-			"CamelStream",
-			sizeof (CamelStreamClass),
-			(GClassInitFunc) stream_class_init,
-			sizeof (CamelStream),
-			(GInstanceInitFunc) NULL,
-			0);
-
-	return type;
 }
 
 /**
diff --git a/camel/camel-tcp-stream-raw.c b/camel/camel-tcp-stream-raw.c
index 29e4472..abda3a7 100644
--- a/camel/camel-tcp-stream-raw.c
+++ b/camel/camel-tcp-stream-raw.c
@@ -52,7 +52,7 @@
 #define ETIMEDOUT EAGAIN
 #endif
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelTcpStreamRaw, camel_tcp_stream_raw, CAMEL_TYPE_TCP_STREAM)
 
 #ifdef SIMULATE_FLAKY_NETWORK
 static gssize
@@ -330,7 +330,7 @@ tcp_stream_raw_finalize (GObject *object)
 		SOCKET_CLOSE (stream->sockfd);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_tcp_stream_raw_parent_class)->finalize (object);
 }
 
 static gssize
@@ -509,14 +509,12 @@ tcp_stream_raw_get_remote_address (CamelTcpStream *stream, socklen_t *len)
 }
 
 static void
-tcp_stream_raw_class_init (CamelTcpStreamRawClass *class)
+camel_tcp_stream_raw_class_init (CamelTcpStreamRawClass *class)
 {
 	GObjectClass *object_class;
 	CamelStreamClass *stream_class;
 	CamelTcpStreamClass *tcp_stream_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->finalize = tcp_stream_raw_finalize;
 
@@ -535,29 +533,11 @@ tcp_stream_raw_class_init (CamelTcpStreamRawClass *class)
 }
 
 static void
-tcp_stream_raw_init (CamelTcpStreamRaw *stream)
+camel_tcp_stream_raw_init (CamelTcpStreamRaw *stream)
 {
 	stream->sockfd = -1;
 }
 
-GType
-camel_tcp_stream_raw_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_TCP_STREAM,
-			"CamelTcpStreamRaw",
-			sizeof (CamelTcpStreamRawClass),
-			(GClassInitFunc) tcp_stream_raw_class_init,
-			sizeof (CamelTcpStreamRaw),
-			(GInstanceInitFunc) tcp_stream_raw_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_tcp_stream_raw_new:
  *
diff --git a/camel/camel-tcp-stream-ssl.c b/camel/camel-tcp-stream-ssl.c
index 92bfcc2..e8b80e2 100644
--- a/camel/camel-tcp-stream-ssl.c
+++ b/camel/camel-tcp-stream-ssl.c
@@ -68,8 +68,6 @@
 	(G_TYPE_INSTANCE_GET_PRIVATE \
 	((obj), CAMEL_TYPE_TCP_STREAM_SSL, CamelTcpStreamSSLPrivate))
 
-static gpointer parent_class;
-
 static gssize stream_read (CamelStream *stream, gchar *buffer, gsize n, GError **error);
 static gssize stream_write (CamelStream *stream, const gchar *buffer, gsize n, GError **error);
 static gint stream_flush  (CamelStream *stream, GError **error);
@@ -92,6 +90,8 @@ struct _CamelTcpStreamSSLPrivate {
 	guint32 flags;
 };
 
+G_DEFINE_TYPE (CamelTcpStreamSSL, camel_tcp_stream_ssl, CAMEL_TYPE_TCP_STREAM)
+
 static void
 tcp_stream_ssl_dispose (GObject *object)
 {
@@ -105,7 +105,7 @@ tcp_stream_ssl_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_tcp_stream_ssl_parent_class)->dispose (object);
 }
 
 static void
@@ -123,17 +123,16 @@ tcp_stream_ssl_finalize (GObject *object)
 	g_free (priv->expected_host);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_tcp_stream_ssl_parent_class)->finalize (object);
 }
 
 static void
-tcp_stream_ssl_class_init (CamelTcpStreamSSLClass *class)
+camel_tcp_stream_ssl_class_init (CamelTcpStreamSSLClass *class)
 {
 	GObjectClass *object_class;
 	CamelStreamClass *stream_class;
 	CamelTcpStreamClass *tcp_stream_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelTcpStreamSSLPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -155,29 +154,11 @@ tcp_stream_ssl_class_init (CamelTcpStreamSSLClass *class)
 }
 
 static void
-tcp_stream_ssl_init (CamelTcpStreamSSL *stream)
+camel_tcp_stream_ssl_init (CamelTcpStreamSSL *stream)
 {
 	stream->priv = CAMEL_TCP_STREAM_SSL_GET_PRIVATE (stream);
 }
 
-GType
-camel_tcp_stream_ssl_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_TCP_STREAM,
-			"CamelTcpStreamSSL",
-			sizeof (CamelTcpStreamSSLClass),
-			(GClassInitFunc) tcp_stream_ssl_class_init,
-			sizeof (CamelTcpStreamSSL),
-			(GInstanceInitFunc) tcp_stream_ssl_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_tcp_stream_ssl_new:
  * @session: an active #CamelSession object
diff --git a/camel/camel-tcp-stream.c b/camel/camel-tcp-stream.c
index 2943f69..9f93999 100644
--- a/camel/camel-tcp-stream.c
+++ b/camel/camel-tcp-stream.c
@@ -30,30 +30,16 @@
 
 #define w(x)
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelTcpStream, camel_tcp_stream, CAMEL_TYPE_STREAM)
 
 static void
-tcp_stream_class_init (CamelTcpStreamClass *class)
+camel_tcp_stream_class_init (CamelTcpStreamClass *class)
 {
-	parent_class = g_type_class_peek_parent (class);
 }
 
-GType
-camel_tcp_stream_get_type (void)
+static void
+camel_tcp_stream_init (CamelTcpStream *tcp_stream)
 {
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_STREAM,
-			"CamelTcpStream",
-			sizeof (CamelTcpStreamClass),
-			(GClassInitFunc) tcp_stream_class_init,
-			sizeof (CamelTcpStream),
-			(GInstanceInitFunc) NULL,
-			0);
-
-	return type;
 }
 
 /**
diff --git a/camel/camel-text-index.c b/camel/camel-text-index.c
index a23505e..94569e3 100644
--- a/camel/camel-text-index.c
+++ b/camel/camel-text-index.c
@@ -171,7 +171,7 @@ struct _CamelTextIndexWord {
 /* CamelTextIndex */
 /* ********************************************************************** */
 
-static gpointer text_index_parent_class;
+G_DEFINE_TYPE (CamelTextIndex, camel_text_index, CAMEL_TYPE_INDEX)
 
 static void
 text_index_dispose (GObject *object)
@@ -215,7 +215,7 @@ text_index_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose () method. */
-	G_OBJECT_CLASS (text_index_parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_text_index_parent_class)->dispose (object);
 }
 
 static void
@@ -233,7 +233,7 @@ text_index_finalize (GObject *object)
 	g_static_rec_mutex_free (&priv->lock);
 
 	/* Chain up to parent's finalize () method. */
-	G_OBJECT_CLASS (text_index_parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_text_index_parent_class)->finalize (object);
 }
 
 /* call locked */
@@ -822,12 +822,11 @@ text_index_names (CamelIndex *idx)
 }
 
 static void
-text_index_class_init (CamelTextIndexClass *class)
+camel_text_index_class_init (CamelTextIndexClass *class)
 {
 	GObjectClass *object_class;
 	CamelIndexClass *index_class;
 
-	text_index_parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelTextIndexPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -850,7 +849,7 @@ text_index_class_init (CamelTextIndexClass *class)
 }
 
 static void
-text_index_init (CamelTextIndex *text_index)
+camel_text_index_init (CamelTextIndex *text_index)
 {
 	text_index->priv = CAMEL_TEXT_INDEX_GET_PRIVATE (text_index);
 
@@ -866,24 +865,6 @@ text_index_init (CamelTextIndex *text_index)
 	g_static_rec_mutex_init (&text_index->priv->lock);
 }
 
-GType
-camel_text_index_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_INDEX,
-			"CamelTextIndex",
-			sizeof (CamelTextIndexClass),
-			(GClassInitFunc) text_index_class_init,
-			sizeof (CamelTextIndex),
-			(GInstanceInitFunc) text_index_init,
-			0);
-
-	return type;
-}
-
 static gchar *
 text_index_normalise (CamelIndex *idx, const gchar *in, gpointer data)
 {
@@ -1465,7 +1446,7 @@ camel_text_index_validate (CamelTextIndex *idx)
 /* CamelTextIndexName */
 /* ********************************************************************** */
 
-static gpointer text_index_name_parent_class;
+G_DEFINE_TYPE (CamelTextIndexName, camel_text_index_name, CAMEL_TYPE_INDEX_NAME)
 
 static void
 text_index_name_finalize (GObject *object)
@@ -1480,7 +1461,7 @@ text_index_name_finalize (GObject *object)
 	e_mempool_destroy (priv->pool);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (text_index_name_parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_text_index_name_parent_class)->finalize (object);
 }
 
 static void
@@ -1598,12 +1579,11 @@ text_index_name_add_buffer (CamelIndexName *idn, const gchar *buffer, gsize len)
 }
 
 static void
-text_index_name_class_init (CamelTextIndexNameClass *class)
+camel_text_index_name_class_init (CamelTextIndexNameClass *class)
 {
 	GObjectClass *object_class;
 	CamelIndexNameClass *index_name_class;
 
-	text_index_name_parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelTextIndexNamePrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -1615,7 +1595,7 @@ text_index_name_class_init (CamelTextIndexNameClass *class)
 }
 
 static void
-text_index_name_init (CamelTextIndexName *text_index_name)
+camel_text_index_name_init (CamelTextIndexName *text_index_name)
 {
 	text_index_name->priv =
 		CAMEL_TEXT_INDEX_NAME_GET_PRIVATE (text_index_name);
@@ -1628,25 +1608,6 @@ text_index_name_init (CamelTextIndexName *text_index_name)
 		e_mempool_new (256, 128, E_MEMPOOL_ALIGN_BYTE);
 }
 
-GType
-camel_text_index_name_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID)) {
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_INDEX_NAME,
-			"CamelTextIndexName",
-			sizeof (CamelTextIndexNameClass),
-			(GClassInitFunc) text_index_name_class_init,
-			sizeof (CamelTextIndexName),
-			(GInstanceInitFunc) text_index_name_init,
-			0);
-	}
-
-	return type;
-}
-
 CamelTextIndexName *
 camel_text_index_name_new (CamelTextIndex *idx, const gchar *name, camel_key_t nameid)
 {
@@ -1666,7 +1627,7 @@ camel_text_index_name_new (CamelTextIndex *idx, const gchar *name, camel_key_t n
 /* CamelTextIndexCursor */
 /* ********************************************************************** */
 
-static gpointer text_index_cursor_parent_class;
+G_DEFINE_TYPE (CamelTextIndexCursor, camel_text_index_cursor, CAMEL_TYPE_INDEX_CURSOR)
 
 static void
 text_index_cursor_finalize (GObject *object)
@@ -1679,7 +1640,7 @@ text_index_cursor_finalize (GObject *object)
 	g_free (priv->current);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (text_index_cursor_parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_text_index_cursor_parent_class)->finalize (object);
 }
 
 static const gchar *
@@ -1732,12 +1693,11 @@ text_index_cursor_reset (CamelIndexCursor *idc)
 }
 
 static void
-text_index_cursor_class_init (CamelTextIndexCursorClass *class)
+camel_text_index_cursor_class_init (CamelTextIndexCursorClass *class)
 {
 	GObjectClass *object_class;
 	CamelIndexCursorClass *index_cursor_class;
 
-	text_index_cursor_parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelTextIndexCursorPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -1749,31 +1709,12 @@ text_index_cursor_class_init (CamelTextIndexCursorClass *class)
 }
 
 static void
-text_index_cursor_init (CamelTextIndexCursor *text_index_cursor)
+camel_text_index_cursor_init (CamelTextIndexCursor *text_index_cursor)
 {
 	text_index_cursor->priv =
 		CAMEL_TEXT_INDEX_CURSOR_GET_PRIVATE (text_index_cursor);
 }
 
-GType
-camel_text_index_cursor_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID)) {
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_INDEX_CURSOR,
-			"CamelTextIndexCursor",
-			sizeof (CamelTextIndexCursorClass),
-			(GClassInitFunc) text_index_cursor_class_init,
-			sizeof (CamelTextIndexCursor),
-			(GInstanceInitFunc) text_index_cursor_init,
-			0);
-	}
-
-	return type;
-}
-
 CamelTextIndexCursor *
 camel_text_index_cursor_new (CamelTextIndex *idx, camel_block_t data)
 {
@@ -1795,7 +1736,7 @@ camel_text_index_cursor_new (CamelTextIndex *idx, camel_block_t data)
 /* CamelTextIndexKeyCursor */
 /* ********************************************************************** */
 
-static gpointer text_index_key_cursor_parent_class;
+G_DEFINE_TYPE (CamelTextIndexKeyCursor, camel_text_index_key_cursor, CAMEL_TYPE_INDEX_CURSOR)
 
 static void
 text_index_key_cursor_dispose (GObject *object)
@@ -1810,7 +1751,7 @@ text_index_key_cursor_dispose (GObject *object)
 	}
 
 	/* Chain up parent's dispose() method. */
-	G_OBJECT_CLASS (text_index_key_cursor_parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_text_index_key_cursor_parent_class)->dispose (object);
 }
 
 static void
@@ -1823,7 +1764,7 @@ text_index_key_cursor_finalize (GObject *object)
 	g_free (priv->current);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (text_index_key_cursor_parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_text_index_key_cursor_parent_class)->finalize (object);
 }
 
 static const gchar *
@@ -1861,12 +1802,11 @@ text_index_key_cursor_reset (CamelIndexCursor *idc)
 }
 
 static void
-text_index_key_cursor_class_init (CamelTextIndexKeyCursorClass *class)
+camel_text_index_key_cursor_class_init (CamelTextIndexKeyCursorClass *class)
 {
 	GObjectClass *object_class;
 	CamelIndexCursorClass *index_cursor_class;
 
-	text_index_key_cursor_parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelTextIndexKeyCursorPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -1879,7 +1819,7 @@ text_index_key_cursor_class_init (CamelTextIndexKeyCursorClass *class)
 }
 
 static void
-text_index_key_cursor_init (CamelTextIndexKeyCursor *text_index_key_cursor)
+camel_text_index_key_cursor_init (CamelTextIndexKeyCursor *text_index_key_cursor)
 {
 	text_index_key_cursor->priv =
 		CAMEL_TEXT_INDEX_KEY_CURSOR_GET_PRIVATE (text_index_key_cursor);
@@ -1890,25 +1830,6 @@ text_index_key_cursor_init (CamelTextIndexKeyCursor *text_index_key_cursor)
 	text_index_key_cursor->priv->current = NULL;
 }
 
-GType
-camel_text_index_key_cursor_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID)) {
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_INDEX_CURSOR,
-			"CamelTextIndexKeyCursor",
-			sizeof (CamelTextIndexKeyCursorClass),
-			(GClassInitFunc) text_index_key_cursor_class_init,
-			sizeof (CamelTextIndexKeyCursor),
-			(GInstanceInitFunc) text_index_key_cursor_init,
-			0);
-	}
-
-	return type;
-}
-
 CamelTextIndexKeyCursor *
 camel_text_index_key_cursor_new (CamelTextIndex *idx, CamelKeyTable *table)
 {
diff --git a/camel/camel-transport.c b/camel/camel-transport.c
index 2a6c4b6..cdbd6ac 100644
--- a/camel/camel-transport.c
+++ b/camel/camel-transport.c
@@ -36,7 +36,7 @@
 	(G_TYPE_INSTANCE_GET_PRIVATE \
 	((obj), CAMEL_TYPE_TRANSPORT, CamelTransportPrivate))
 
-static gpointer parent_class;
+G_DEFINE_ABSTRACT_TYPE (CamelTransport, camel_transport, CAMEL_TYPE_SERVICE)
 
 static void
 transport_finalize (GObject *object)
@@ -48,15 +48,14 @@ transport_finalize (GObject *object)
 	g_mutex_free (priv->send_lock);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_transport_parent_class)->finalize (object);
 }
 
 static void
-transport_class_init (CamelTransportClass *class)
+camel_transport_class_init (CamelTransportClass *class)
 {
 	GObjectClass *object_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelTransportPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -64,31 +63,13 @@ transport_class_init (CamelTransportClass *class)
 }
 
 static void
-transport_init (CamelTransport *transport)
+camel_transport_init (CamelTransport *transport)
 {
 	transport->priv = CAMEL_TRANSPORT_GET_PRIVATE (transport);
 
 	transport->priv->send_lock = g_mutex_new ();
 }
 
-GType
-camel_transport_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_SERVICE,
-			"CamelTransport",
-			sizeof (CamelTransportClass),
-			(GClassInitFunc) transport_class_init,
-			sizeof (CamelTransport),
-			(GInstanceInitFunc) transport_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_transport_send_to:
  * @transport: a #CamelTransport object
diff --git a/camel/camel-vee-folder.c b/camel/camel-vee-folder.c
index d04c015..94a5dcf 100644
--- a/camel/camel-vee-folder.c
+++ b/camel/camel-vee-folder.c
@@ -58,8 +58,6 @@ struct _update_data {
 	gboolean rebuilt, correlating;
 };
 
-static gpointer parent_class;
-
 struct _folder_changed_msg {
 	CamelSessionThreadMsg msg;
 	CamelFolderChangeInfo *changes;
@@ -67,6 +65,8 @@ struct _folder_changed_msg {
 	CamelVeeFolder *vee_folder;
 };
 
+G_DEFINE_TYPE (CamelVeeFolder, camel_vee_folder, CAMEL_TYPE_FOLDER)
+
 /* must be called with summary_lock held */
 static CamelVeeMessageInfo *
 vee_folder_add_uid (CamelVeeFolder *vf,
@@ -1034,7 +1034,7 @@ vee_folder_finalize (GObject *object)
 	g_hash_table_destroy (vf->hashes);
 
 	/* Chain up to parent's finalize () method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_vee_folder_parent_class)->finalize (object);
 }
 
 /* This entire code will be useless, since we sync the counts always. */
@@ -1135,7 +1135,7 @@ vee_folder_getv (CamelObject *object,
 		arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE;
 	}
 
-	return ((CamelObjectClass *)parent_class)->getv (object, error, args);
+	return ((CamelObjectClass *)camel_vee_folder_parent_class)->getv (object, error, args);
 }
 
 static gboolean
@@ -1490,7 +1490,7 @@ vee_folder_delete (CamelFolder *folder)
 	}
 	CAMEL_VEE_FOLDER_UNLOCK (folder, subfolder_lock);
 
-	((CamelFolderClass *)parent_class)->delete (folder);
+	((CamelFolderClass *)camel_vee_folder_parent_class)->delete (folder);
 	((CamelVeeFolder *)folder)->deleted = TRUE;
 }
 
@@ -1514,7 +1514,7 @@ vee_folder_freeze (CamelFolder *folder)
 	CAMEL_VEE_FOLDER_UNLOCK (vfolder, subfolder_lock);
 
 	/* call parent implementation */
-	CAMEL_FOLDER_CLASS (parent_class)->freeze (folder);
+	CAMEL_FOLDER_CLASS (camel_vee_folder_parent_class)->freeze (folder);
 }
 
 static void
@@ -1537,7 +1537,7 @@ vee_folder_thaw (CamelFolder *folder)
 	CAMEL_VEE_FOLDER_UNLOCK (vfolder, subfolder_lock);
 
 	/* call parent implementation */
-	CAMEL_FOLDER_CLASS (parent_class)->thaw (folder);
+	CAMEL_FOLDER_CLASS (camel_vee_folder_parent_class)->thaw (folder);
 }
 
 static void
@@ -1895,13 +1895,12 @@ vee_folder_folder_renamed (CamelVeeFolder *vee_folder,
 }
 
 static void
-vee_folder_class_init (CamelVeeFolderClass *class)
+camel_vee_folder_class_init (CamelVeeFolderClass *class)
 {
 	GObjectClass *object_class;
 	CamelObjectClass *camel_object_class;
 	CamelFolderClass *folder_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelVeeFolderPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -1933,7 +1932,7 @@ vee_folder_class_init (CamelVeeFolderClass *class)
 }
 
 static void
-vee_folder_init (CamelVeeFolder *vee_folder)
+camel_vee_folder_init (CamelVeeFolder *vee_folder)
 {
 	CamelFolder *folder = CAMEL_FOLDER (vee_folder);
 
@@ -1963,24 +1962,6 @@ vee_folder_init (CamelVeeFolder *vee_folder)
 	vee_folder->priv->unread_vfolder = -1;
 }
 
-GType
-camel_vee_folder_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_FOLDER,
-			"CamelVeeFolder",
-			sizeof (CamelVeeFolderClass),
-			(GClassInitFunc) vee_folder_class_init,
-			sizeof (CamelVeeFolder),
-			(GInstanceInitFunc) vee_folder_init,
-			0);
-
-	return type;
-}
-
 void
 camel_vee_folder_construct (CamelVeeFolder *vf, CamelStore *parent_store, const gchar *full, const gchar *name, guint32 flags)
 {
diff --git a/camel/camel-vee-store.c b/camel/camel-vee-store.c
index 81a66ce..48d6bcb 100644
--- a/camel/camel-vee-store.c
+++ b/camel/camel-vee-store.c
@@ -43,7 +43,7 @@
 #define CHANGE_DELETE (1)
 #define CHANGE_NOSELECT (2)
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelVeeStore, camel_vee_store, CAMEL_TYPE_STORE)
 
 static gint
 vee_folder_cmp (gconstpointer ap,
@@ -102,7 +102,7 @@ vee_store_finalize (GObject *object)
 	g_object_unref (vee_store->folder_unmatched);
 
 	/* Chain up to parent's finalize () method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_vee_store_parent_class)->finalize (object);
 }
 
 static gboolean
@@ -120,7 +120,7 @@ vee_store_construct (CamelService *service,
 	vee_store = CAMEL_VEE_STORE (service);
 
 	/* Chain up to parent's construct() method. */
-	service_class = CAMEL_SERVICE_CLASS (parent_class);
+	service_class = CAMEL_SERVICE_CLASS (camel_vee_store_parent_class);
 	if (!service_class->construct (service, session, provider, url, error))
 		return FALSE;
 
@@ -420,14 +420,12 @@ vee_store_get_junk (CamelStore *store,
 }
 
 static void
-vee_store_class_init (CamelVeeStoreClass *class)
+camel_vee_store_class_init (CamelVeeStoreClass *class)
 {
 	GObjectClass *object_class;
 	CamelServiceClass *service_class;
 	CamelStoreClass *store_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->finalize = vee_store_finalize;
 
@@ -445,7 +443,7 @@ vee_store_class_init (CamelVeeStoreClass *class)
 }
 
 static void
-vee_store_init (CamelVeeStore *vee_store)
+camel_vee_store_init (CamelVeeStore *vee_store)
 {
 	CamelStore *store = CAMEL_STORE (vee_store);
 
@@ -453,24 +451,6 @@ vee_store_init (CamelVeeStore *vee_store)
 	store->flags &= ~(CAMEL_STORE_VTRASH | CAMEL_STORE_VJUNK);
 }
 
-GType
-camel_vee_store_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_STORE,
-			"CamelVeeStore",
-			sizeof (CamelVeeStoreClass),
-			(GClassInitFunc) vee_store_class_init,
-			sizeof (CamelVeeStore),
-			(GInstanceInitFunc) vee_store_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_vee_store_new:
  *
diff --git a/camel/camel-vee-summary.c b/camel/camel-vee-summary.c
index d3c909d..1c9c2a0 100644
--- a/camel/camel-vee-summary.c
+++ b/camel/camel-vee-summary.c
@@ -41,10 +41,10 @@
 
 #define d(x)
 
-static gpointer parent_class;
-
 static const gchar *unread_str = " (and\n  \n     (match-all (not (system-flag  \"Seen\")))\n    \n  )\n;  (or\n  \n     (match-all (not (system-flag  \"Seen\")))\n    \n  )\n; (match-threads \"all\"  (and\n  \n     (match-all (not (system-flag  \"Seen\")))\n    \n  )\n)\n;  (match-threads \"all\"  (or\n  \n     (match-all (not (system-flag  \"Seen\")))\n    \n  )\n)\n;";
 
+G_DEFINE_TYPE (CamelVeeSummary, camel_vee_summary, CAMEL_TYPE_FOLDER_SUMMARY)
+
 static void
 vee_message_info_free(CamelFolderSummary *s, CamelMessageInfo *info)
 {
@@ -381,12 +381,10 @@ message_info_from_uid (CamelFolderSummary *s, const gchar *uid)
 }
 
 static void
-vee_summary_class_init (CamelVeeSummaryClass *class)
+camel_vee_summary_class_init (CamelVeeSummaryClass *class)
 {
 	CamelFolderSummaryClass *folder_summary_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	folder_summary_class = CAMEL_FOLDER_SUMMARY_CLASS (class);
 	folder_summary_class->message_info_size = sizeof (CamelVeeMessageInfo);
 	folder_summary_class->content_info_size = 0;
@@ -403,22 +401,9 @@ vee_summary_class_init (CamelVeeSummaryClass *class)
 	folder_summary_class->message_info_from_uid = message_info_from_uid;
 }
 
-GType
-camel_vee_summary_get_type (void)
+static void
+camel_vee_summary_init (CamelVeeSummary *vee_summary)
 {
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_FOLDER_SUMMARY,
-			"CamelVeeSummary",
-			sizeof (CamelVeeSummaryClass),
-			(GClassInitFunc) vee_summary_class_init,
-			sizeof (CamelVeeSummary),
-			(GInstanceInitFunc) NULL,
-			0);
-
-	return type;
 }
 
 /**
diff --git a/camel/camel-vtrash-folder.c b/camel/camel-vtrash-folder.c
index 631ec5d..b3113e8 100644
--- a/camel/camel-vtrash-folder.c
+++ b/camel/camel-vtrash-folder.c
@@ -37,9 +37,6 @@
 #include "camel-vtrash-folder.h"
 #include "camel-string-utils.h"
 
-/* Returns the class for a CamelFolder */
-#define CF_CLASS(so) ((CamelFolderClass *)((CamelObject *)(so))->class)
-
 static struct {
 	const gchar *full_name;
 	const gchar *name;
@@ -62,7 +59,7 @@ struct _transfer_data {
 	gboolean delete;
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelVTrashFolder, camel_vtrash_folder, CAMEL_TYPE_VEE_FOLDER)
 
 static void
 transfer_messages (CamelFolder *folder,
@@ -168,7 +165,7 @@ vtrash_folder_getv (CamelObject *object,
 		arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE;
 	}
 
-	return CAMEL_OBJECT_CLASS (parent_class)->getv (object, error, args);
+	return CAMEL_OBJECT_CLASS (camel_vtrash_folder_parent_class)->getv (object, error, args);
 }
 
 static gboolean
@@ -269,13 +266,11 @@ vtrash_folder_transfer_messages_to (CamelFolder *source,
 }
 
 static void
-vtrash_folder_class_init (CamelVTrashFolderClass *class)
+camel_vtrash_folder_class_init (CamelVTrashFolderClass *class)
 {
 	CamelObjectClass *camel_object_class;
 	CamelFolderClass *folder_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	/* Not required from here on. We don't count */
 	camel_object_class = CAMEL_OBJECT_CLASS (class);
 	camel_object_class->getv = vtrash_folder_getv;
@@ -285,22 +280,9 @@ vtrash_folder_class_init (CamelVTrashFolderClass *class)
 	folder_class->transfer_messages_to = vtrash_folder_transfer_messages_to;
 }
 
-GType
-camel_vtrash_folder_get_type (void)
+static void
+camel_vtrash_folder_init (CamelVTrashFolder *vtrash_folder)
 {
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_VEE_FOLDER,
-			"CamelVTrashFolder",
-			sizeof (CamelVTrashFolderClass),
-			(GClassInitFunc) vtrash_folder_class_init,
-			sizeof (CamelVTrashFolder),
-			(GInstanceInitFunc) NULL,
-			0);
-
-	return type;
 }
 
 /**
diff --git a/camel/providers/groupwise/camel-groupwise-folder.c b/camel/providers/groupwise/camel-groupwise-folder.c
index 73cd4d8..3a45561 100644
--- a/camel/providers/groupwise/camel-groupwise-folder.c
+++ b/camel/providers/groupwise/camel-groupwise-folder.c
@@ -69,8 +69,6 @@ which needs to be better organized via functions */
 	(G_TYPE_INSTANCE_GET_PRIVATE \
 	((obj), CAMEL_TYPE_GROUPWISE_FOLDER, CamelGroupwiseFolderPrivate))
 
-static gpointer parent_class;
-
 struct _CamelGroupwiseFolderPrivate {
 
 #ifdef ENABLE_THREADS
@@ -104,6 +102,8 @@ static gboolean groupwise_sync (CamelFolder *folder, gboolean expunge, CamelMess
 static const gchar * GET_ITEM_VIEW_WITH_CACHE = "peek default recipient threading attachments subject status priority startDate created delivered size recurrenceKey message notification";
 static const gchar * GET_ITEM_VIEW_WITHOUT_CACHE = "peek default recipient threading hasAttachment subject status priority startDate created delivered size recurrenceKey";
 
+G_DEFINE_TYPE (CamelGroupwiseFolder, camel_groupwise_folder, CAMEL_TYPE_OFFLINE_FOLDER)
+
 static gchar *
 groupwise_get_filename (CamelFolder *folder, const gchar *uid, GError **error)
 {
@@ -481,7 +481,7 @@ groupwise_folder_rename (CamelFolder *folder, const gchar *new)
 	camel_data_cache_set_path (gw_folder->cache, folder_dir);
 	CAMEL_GROUPWISE_FOLDER_REC_UNLOCK (folder, cache_lock);
 
-	((CamelFolderClass *)parent_class)->rename(folder, new);
+	((CamelFolderClass *)camel_groupwise_folder_parent_class)->rename(folder, new);
 	camel_folder_summary_set_filename (folder->summary, summary_path);
 
 	state_file = g_strdup_printf ("%s/cmeta", folder_dir);
@@ -2810,17 +2810,16 @@ groupwise_folder_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_groupwise_folder_parent_class)->dispose (object);
 }
 
 static void
-groupwise_folder_class_init (CamelGroupwiseFolderClass *class)
+camel_groupwise_folder_class_init (CamelGroupwiseFolderClass *class)
 {
 	GObjectClass *object_class;
 	CamelObjectClass *camel_object_class;
 	CamelFolderClass *folder_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelGroupwiseFolderPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -2847,7 +2846,7 @@ groupwise_folder_class_init (CamelGroupwiseFolderClass *class)
 }
 
 static void
-groupwise_folder_init (CamelGroupwiseFolder *gw_folder)
+camel_groupwise_folder_init (CamelGroupwiseFolder *gw_folder)
 {
 	CamelFolder *folder = CAMEL_FOLDER (gw_folder);
 
@@ -2866,24 +2865,6 @@ groupwise_folder_init (CamelGroupwiseFolder *gw_folder)
 	gw_folder->need_rescan = TRUE;
 }
 
-GType
-camel_groupwise_folder_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (type == G_TYPE_INVALID)
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OFFLINE_FOLDER,
-			"CamelGroupwiseFolder",
-			sizeof (CamelGroupwiseFolderClass),
-			(GClassInitFunc) groupwise_folder_class_init,
-			sizeof (CamelGroupwiseFolder),
-			(GInstanceInitFunc) groupwise_folder_init,
-			0);
-
-	return type;
-}
-
 static gint
 gw_getv (CamelObject *object, GError **error, CamelArgGetV *args)
 {
@@ -2915,7 +2896,7 @@ gw_getv (CamelObject *object, GError **error, CamelArgGetV *args)
 	}
 
 	if (count)
-		return ((CamelObjectClass *)parent_class)->getv(object, error, args);
+		return ((CamelObjectClass *)camel_groupwise_folder_parent_class)->getv(object, error, args);
 
 	return 0;
 
diff --git a/camel/providers/groupwise/camel-groupwise-journal.c b/camel/providers/groupwise/camel-groupwise-journal.c
index 29520db..4ac9594 100644
--- a/camel/providers/groupwise/camel-groupwise-journal.c
+++ b/camel/providers/groupwise/camel-groupwise-journal.c
@@ -46,15 +46,13 @@ static CamelDListNode *groupwise_entry_load (CamelOfflineJournal *journal, FILE
 static gint groupwise_entry_write (CamelOfflineJournal *journal, CamelDListNode *entry, FILE *out);
 static gint groupwise_entry_play (CamelOfflineJournal *journal, CamelDListNode *entry, GError **error);
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelGroupwiseJournal, camel_groupwise_journal, CAMEL_TYPE_OFFLINE_JOURNAL)
 
 static void
-groupwise_journal_class_init (CamelGroupwiseJournalClass *class)
+camel_groupwise_journal_class_init (CamelGroupwiseJournalClass *class)
 {
 	CamelOfflineJournalClass *offline_journal_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	offline_journal_class = CAMEL_OFFLINE_JOURNAL_CLASS (class);
 	offline_journal_class->entry_free = groupwise_entry_free;
 	offline_journal_class->entry_load = groupwise_entry_load;
@@ -62,22 +60,9 @@ groupwise_journal_class_init (CamelGroupwiseJournalClass *class)
 	offline_journal_class->entry_play = groupwise_entry_play;
 }
 
-GType
-camel_groupwise_journal_get_type (void)
+static void
+camel_groupwise_journal_init (CamelGroupwiseJournal *groupwise_journal)
 {
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OFFLINE_JOURNAL,
-			"CamelGroupwiseJournal",
-			sizeof (CamelGroupwiseJournalClass),
-			(GClassInitFunc) groupwise_journal_class_init,
-			sizeof (CamelGroupwiseJournal),
-			(GInstanceInitFunc) NULL,
-			0);
-
-	return type;
 }
 
 static void
diff --git a/camel/providers/groupwise/camel-groupwise-store-summary.c b/camel/providers/groupwise/camel-groupwise-store-summary.c
index 2314879..06bd872 100644
--- a/camel/providers/groupwise/camel-groupwise-store-summary.c
+++ b/camel/providers/groupwise/camel-groupwise-store-summary.c
@@ -52,15 +52,13 @@ static void store_info_set_string(CamelStoreSummary *s, CamelStoreInfo *mi, gint
 static const gchar *store_info_string(CamelStoreSummary *s, const CamelStoreInfo *mi, gint type);
 CamelGroupwiseStoreNamespace *camel_groupwise_store_summary_namespace_find_full(CamelGroupwiseStoreSummary *s, const gchar *full);
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelGroupwiseStoreSummary, camel_groupwise_store_summary, CAMEL_TYPE_STORE_SUMMARY)
 
 static void
-groupwise_store_summary_class_init (CamelGroupwiseStoreSummaryClass *class)
+camel_groupwise_store_summary_class_init (CamelGroupwiseStoreSummaryClass *class)
 {
 	CamelStoreSummaryClass *store_summary_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	store_summary_class = CAMEL_STORE_SUMMARY_CLASS (class);
 	store_summary_class->summary_header_load = summary_header_load;
 	store_summary_class->summary_header_save = summary_header_save;
@@ -72,7 +70,7 @@ groupwise_store_summary_class_init (CamelGroupwiseStoreSummaryClass *class)
 }
 
 static void
-groupwise_store_summary_init (CamelGroupwiseStoreSummary *gw_summary)
+camel_groupwise_store_summary_init (CamelGroupwiseStoreSummary *gw_summary)
 {
 	CamelStoreSummary *summary = CAMEL_STORE_SUMMARY (gw_summary);
 
@@ -80,24 +78,6 @@ groupwise_store_summary_init (CamelGroupwiseStoreSummary *gw_summary)
 	gw_summary->version = CAMEL_GW_STORE_SUMMARY_VERSION;
 }
 
-GType
-camel_groupwise_store_summary_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_STORE_SUMMARY,
-			"CamelGroupwiseStoreSummary",
-			sizeof (CamelGroupwiseStoreSummaryClass),
-			(GClassInitFunc) groupwise_store_summary_class_init,
-			sizeof (CamelGroupwiseStoreSummary),
-			(GInstanceInitFunc) groupwise_store_summary_init,
-			0);
-
-	return type;
-}
-
 CamelGroupwiseStoreSummary *
 camel_groupwise_store_summary_new (void)
 {
@@ -445,7 +425,7 @@ summary_header_load(CamelStoreSummary *s, FILE *in)
 
 	namespace_clear (s);
 
-	if (CAMEL_STORE_SUMMARY_CLASS (parent_class)->summary_header_load ((CamelStoreSummary *)s, in) == -1
+	if (CAMEL_STORE_SUMMARY_CLASS (camel_groupwise_store_summary_parent_class)->summary_header_load ((CamelStoreSummary *)s, in) == -1
 			|| camel_file_util_decode_fixed_int32(in, &version) == -1)
 		return -1;
 
@@ -471,7 +451,7 @@ summary_header_save(CamelStoreSummary *s, FILE *out)
 	guint32 count;
 
 	count = summary->namespace?1:0;
-	if (CAMEL_STORE_SUMMARY_CLASS (parent_class)->summary_header_save((CamelStoreSummary *)s, out) == -1
+	if (CAMEL_STORE_SUMMARY_CLASS (camel_groupwise_store_summary_parent_class)->summary_header_save((CamelStoreSummary *)s, out) == -1
 			|| camel_file_util_encode_fixed_int32(out, 0) == -1
 			|| camel_file_util_encode_fixed_int32(out, summary->capabilities) == -1
 			|| camel_file_util_encode_fixed_int32(out, count) == -1)
@@ -488,7 +468,7 @@ store_info_load(CamelStoreSummary *s, FILE *in)
 {
 	CamelGroupwiseStoreInfo *si;
 
-	si = (CamelGroupwiseStoreInfo *)CAMEL_STORE_SUMMARY_CLASS (parent_class)->store_info_load(s, in);
+	si = (CamelGroupwiseStoreInfo *)CAMEL_STORE_SUMMARY_CLASS (camel_groupwise_store_summary_parent_class)->store_info_load(s, in);
 	if (si) {
 		if (camel_file_util_decode_string(in, &si->full_name) == -1) {
 			camel_store_summary_info_free(s, (CamelStoreInfo *)si);
@@ -504,7 +484,7 @@ store_info_save(CamelStoreSummary *s, FILE *out, CamelStoreInfo *mi)
 {
 	CamelGroupwiseStoreInfo *summary = (CamelGroupwiseStoreInfo *)mi;
 
-	if (CAMEL_STORE_SUMMARY_CLASS (parent_class)->store_info_save(s, out, mi) == -1
+	if (CAMEL_STORE_SUMMARY_CLASS (camel_groupwise_store_summary_parent_class)->store_info_save(s, out, mi) == -1
 			|| camel_file_util_encode_string(out, summary->full_name) == -1)
 		return -1;
 
@@ -517,7 +497,7 @@ store_info_free(CamelStoreSummary *s, CamelStoreInfo *mi)
 	CamelGroupwiseStoreInfo *si = (CamelGroupwiseStoreInfo *)mi;
 
 	g_free(si->full_name);
-	CAMEL_STORE_SUMMARY_CLASS (parent_class)->store_info_free(s, mi);
+	CAMEL_STORE_SUMMARY_CLASS (camel_groupwise_store_summary_parent_class)->store_info_free(s, mi);
 }
 
 static const gchar *
@@ -533,7 +513,7 @@ store_info_string(CamelStoreSummary *s, const CamelStoreInfo *mi, gint type)
 		case CAMEL_STORE_INFO_LAST:
 			return isi->full_name;
 		default:
-			return CAMEL_STORE_SUMMARY_CLASS (parent_class)->store_info_string(s, mi, type);
+			return CAMEL_STORE_SUMMARY_CLASS (camel_groupwise_store_summary_parent_class)->store_info_string(s, mi, type);
 	}
 }
 
@@ -553,7 +533,7 @@ store_info_set_string(CamelStoreSummary *s, CamelStoreInfo *mi, gint type, const
 			CAMEL_STORE_SUMMARY_UNLOCK(s, summary_lock);
 			break;
 		default:
-			CAMEL_STORE_SUMMARY_CLASS (parent_class)->store_info_set_string(s, mi, type, str);
+			CAMEL_STORE_SUMMARY_CLASS (camel_groupwise_store_summary_parent_class)->store_info_set_string(s, mi, type, str);
 			break;
 	}
 }
diff --git a/camel/providers/groupwise/camel-groupwise-store.c b/camel/providers/groupwise/camel-groupwise-store.c
index 420ad4b..9fdc748 100644
--- a/camel/providers/groupwise/camel-groupwise-store.c
+++ b/camel/providers/groupwise/camel-groupwise-store.c
@@ -71,13 +71,13 @@ struct _CamelGroupwiseStorePrivate {
 	EGwConnection *cnc;
 };
 
-static gpointer parent_class;
-
 extern CamelServiceAuthType camel_groupwise_password_authtype; /*for the query_auth_types function*/
 static CamelFolderInfo *convert_to_folder_info (CamelGroupwiseStore *store, EGwContainer *container, const gchar *url, GError **error);
 static gboolean groupwise_folders_sync (CamelGroupwiseStore *store, GError **error);
 static gint match_path(const gchar *path, const gchar *name);
 
+G_DEFINE_TYPE (CamelGroupwiseStore, camel_groupwise_store, CAMEL_TYPE_OFFLINE_STORE)
+
 static gboolean
 groupwise_store_construct (CamelService *service, CamelSession *session,
 			   CamelProvider *provider, CamelURL *url,
@@ -93,7 +93,7 @@ groupwise_store_construct (CamelService *service, CamelSession *session,
 	d(printf ("\nin groupwise store constrcut\n"));
 
 	/* Chain up to parent's construct() method. */
-	service_class = CAMEL_SERVICE_CLASS (parent_class);
+	service_class = CAMEL_SERVICE_CLASS (camel_groupwise_store_parent_class);
 	if (!service_class->construct (service, session, provider, url, error))
 		return FALSE;
 
@@ -1452,7 +1452,7 @@ groupwise_can_refresh_folder (CamelStore *store, CamelFolderInfo *info, GError *
 {
 	gboolean res;
 
-	res = CAMEL_STORE_CLASS(parent_class)->can_refresh_folder (store, info, error) ||
+	res = CAMEL_STORE_CLASS(camel_groupwise_store_parent_class)->can_refresh_folder (store, info, error) ||
 	      (camel_url_get_param (((CamelService *)store)->url, "check_all") != NULL);
 
 	return res;
@@ -1519,7 +1519,7 @@ groupwise_store_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_groupwise_store_parent_class)->dispose (object);
 }
 
 static void
@@ -1547,17 +1547,16 @@ groupwise_store_finalize (GObject *object)
 		g_hash_table_destroy (groupwise_store->priv->parent_hash);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_groupwise_store_parent_class)->finalize (object);
 }
 
 static void
-groupwise_store_class_init (CamelGroupwiseStoreClass *class)
+camel_groupwise_store_class_init (CamelGroupwiseStoreClass *class)
 {
 	GObjectClass *object_class;
 	CamelServiceClass *service_class;
 	CamelStoreClass *store_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelGroupwiseStorePrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -1585,7 +1584,7 @@ groupwise_store_class_init (CamelGroupwiseStoreClass *class)
 }
 
 static void
-groupwise_store_init (CamelGroupwiseStore *groupwise_store)
+camel_groupwise_store_init (CamelGroupwiseStore *groupwise_store)
 {
 	groupwise_store->priv =
 		CAMEL_GROUPWISE_STORE_GET_PRIVATE (groupwise_store);
@@ -1599,21 +1598,3 @@ groupwise_store_init (CamelGroupwiseStore *groupwise_store)
 	groupwise_store->current_folder = NULL;
 }
 
-GType
-camel_groupwise_store_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (type == G_TYPE_INVALID)
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OFFLINE_STORE,
-			"CamelGroupwiseStore",
-			sizeof (CamelGroupwiseStoreClass),
-			(GClassInitFunc) groupwise_store_class_init,
-			sizeof (CamelGroupwiseStore),
-			(GInstanceInitFunc) groupwise_store_init,
-			0);
-
-	return type;
-}
-
diff --git a/camel/providers/groupwise/camel-groupwise-summary.c b/camel/providers/groupwise/camel-groupwise-summary.c
index 72fa651..c07b2f1 100644
--- a/camel/providers/groupwise/camel-groupwise-summary.c
+++ b/camel/providers/groupwise/camel-groupwise-summary.c
@@ -63,7 +63,7 @@ static CamelMessageContentInfo * content_info_from_db (CamelFolderSummary *s, Ca
 
 /*End of Prototypes*/
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelGroupwiseSummary, camel_groupwise_summary, CAMEL_TYPE_FOLDER_SUMMARY)
 
 static CamelMessageInfo *
 gw_message_info_clone(CamelFolderSummary *s, const CamelMessageInfo *mi)
@@ -71,7 +71,7 @@ gw_message_info_clone(CamelFolderSummary *s, const CamelMessageInfo *mi)
 	CamelGroupwiseMessageInfo *to;
 	const CamelGroupwiseMessageInfo *from = (const CamelGroupwiseMessageInfo *)mi;
 
-	to = (CamelGroupwiseMessageInfo *)CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->message_info_clone(s, mi);
+	to = (CamelGroupwiseMessageInfo *)CAMEL_FOLDER_SUMMARY_CLASS (camel_groupwise_summary_parent_class)->message_info_clone(s, mi);
 	to->server_flags = from->server_flags;
 
 	/* FIXME: parent clone should do this */
@@ -81,12 +81,10 @@ gw_message_info_clone(CamelFolderSummary *s, const CamelMessageInfo *mi)
 }
 
 static void
-groupwise_summary_class_init (CamelGroupwiseSummaryClass *class)
+camel_groupwise_summary_class_init (CamelGroupwiseSummaryClass *class)
 {
 	CamelFolderSummaryClass *folder_summary_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	folder_summary_class = CAMEL_FOLDER_SUMMARY_CLASS (class);
 	folder_summary_class->message_info_size = sizeof (CamelGroupwiseMessageInfo);
 	folder_summary_class->content_info_size = sizeof (CamelGroupwiseMessageContentInfo);
@@ -107,7 +105,7 @@ groupwise_summary_class_init (CamelGroupwiseSummaryClass *class)
 }
 
 static void
-groupwise_summary_init (CamelGroupwiseSummary *gw_summary)
+camel_groupwise_summary_init (CamelGroupwiseSummary *gw_summary)
 {
 	CamelFolderSummary *summary = CAMEL_FOLDER_SUMMARY (gw_summary);
 
@@ -115,24 +113,6 @@ groupwise_summary_init (CamelGroupwiseSummary *gw_summary)
 	summary->meta_summary->uid_len = 2048;
 }
 
-GType
-camel_groupwise_summary_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_FOLDER_SUMMARY,
-			"CamelGroupwiseSummary",
-			sizeof (CamelGroupwiseSummaryClass),
-			(GClassInitFunc) groupwise_summary_class_init,
-			sizeof (CamelGroupwiseSummary),
-			(GInstanceInitFunc) groupwise_summary_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_groupwise_summary_new:
  * @filename: the file to store the summary in.
@@ -165,7 +145,7 @@ summary_header_from_db (CamelFolderSummary *s, CamelFIRecord *mir)
 	CamelGroupwiseSummary *gms = CAMEL_GROUPWISE_SUMMARY (s);
 	gchar *part;
 
-	if (CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->summary_header_from_db (s, mir) == -1)
+	if (CAMEL_FOLDER_SUMMARY_CLASS (camel_groupwise_summary_parent_class)->summary_header_from_db (s, mir) == -1)
 		return -1;
 
 	part = mir->bdata;
@@ -188,7 +168,7 @@ gw_summary_header_load (CamelFolderSummary *s, FILE *in)
 {
 	CamelGroupwiseSummary *gms = CAMEL_GROUPWISE_SUMMARY (s);
 
-	if (CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->summary_header_load (s, in) == -1)
+	if (CAMEL_FOLDER_SUMMARY_CLASS (camel_groupwise_summary_parent_class)->summary_header_load (s, in) == -1)
 		return -1;
 
 	if (camel_file_util_decode_fixed_int32(in, &gms->version) == -1
@@ -206,7 +186,7 @@ summary_header_to_db (CamelFolderSummary *s, GError **error)
 	CamelGroupwiseSummary *ims = CAMEL_GROUPWISE_SUMMARY(s);
 	struct _CamelFIRecord *fir;
 
-	fir = CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->summary_header_to_db (s, error);
+	fir = CAMEL_FOLDER_SUMMARY_CLASS (camel_groupwise_summary_parent_class)->summary_header_to_db (s, error);
 	if (!fir)
 		return NULL;
 
@@ -221,7 +201,7 @@ gw_summary_header_save (CamelFolderSummary *s, FILE *out)
 {
 	CamelGroupwiseSummary *gms = CAMEL_GROUPWISE_SUMMARY(s);
 
-	if (CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->summary_header_save (s, out) == -1)
+	if (CAMEL_FOLDER_SUMMARY_CLASS (camel_groupwise_summary_parent_class)->summary_header_save (s, out) == -1)
 		return -1;
 
 	camel_file_util_encode_fixed_int32(out, CAMEL_GW_SUMMARY_VERSION);
@@ -235,7 +215,7 @@ message_info_from_db (CamelFolderSummary *s, CamelMIRecord *mir)
 	CamelMessageInfo *info;
 	CamelGroupwiseMessageInfo *iinfo;
 
-	info = CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->message_info_from_db (s, mir);
+	info = CAMEL_FOLDER_SUMMARY_CLASS (camel_groupwise_summary_parent_class)->message_info_from_db (s, mir);
 	if (info) {
 		gchar *part = mir->bdata;
 		iinfo = (CamelGroupwiseMessageInfo *)info;
@@ -250,7 +230,7 @@ gw_message_info_load (CamelFolderSummary *s, FILE *in)
 	CamelMessageInfo *info;
 	CamelGroupwiseMessageInfo *gw_info;
 
-	info = CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->message_info_load(s,in);
+	info = CAMEL_FOLDER_SUMMARY_CLASS (camel_groupwise_summary_parent_class)->message_info_load(s,in);
 	if (info) {
 		gw_info = (CamelGroupwiseMessageInfo*) info;
 		if (camel_file_util_decode_uint32 (in, &gw_info->server_flags) == -1)
@@ -269,7 +249,7 @@ message_info_to_db (CamelFolderSummary *s, CamelMessageInfo *info)
 	CamelGroupwiseMessageInfo *iinfo = (CamelGroupwiseMessageInfo *)info;
 	struct _CamelMIRecord *mir;
 
-	mir = CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->message_info_to_db (s, info);
+	mir = CAMEL_FOLDER_SUMMARY_CLASS (camel_groupwise_summary_parent_class)->message_info_to_db (s, info);
 	if (mir)
 		mir->bdata = g_strdup_printf ("%u", iinfo->server_flags);
 
@@ -281,7 +261,7 @@ gw_message_info_save (CamelFolderSummary *s, FILE *out, CamelMessageInfo *info)
 {
 	CamelGroupwiseMessageInfo *gw_info = (CamelGroupwiseMessageInfo *)info;
 
-	if (CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->message_info_save (s, out, info) == -1)
+	if (CAMEL_FOLDER_SUMMARY_CLASS (camel_groupwise_summary_parent_class)->message_info_save (s, out, info) == -1)
 		return -1;
 
 	return camel_file_util_encode_uint32 (out, gw_info->server_flags);
@@ -302,7 +282,7 @@ content_info_from_db (CamelFolderSummary *s, CamelMIRecord *mir)
 	}
 	mir->cinfo = part;
 	if (type)
-		return CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->content_info_from_db (s, mir);
+		return CAMEL_FOLDER_SUMMARY_CLASS (camel_groupwise_summary_parent_class)->content_info_from_db (s, mir);
 	else
 		return camel_folder_summary_content_info_new (s);
 }
@@ -311,7 +291,7 @@ static CamelMessageContentInfo *
 gw_content_info_load (CamelFolderSummary *s, FILE *in)
 {
 	if (fgetc (in))
-		return CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->content_info_load (s, in);
+		return CAMEL_FOLDER_SUMMARY_CLASS (camel_groupwise_summary_parent_class)->content_info_load (s, in);
 	else
 		return camel_folder_summary_content_info_new (s);
 }
@@ -322,7 +302,7 @@ content_info_to_db (CamelFolderSummary *s, CamelMessageContentInfo *info, CamelM
 
 	if (info->type) {
 		mir->cinfo = g_strdup ("1");
-		return CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->content_info_to_db (s, info, mir);
+		return CAMEL_FOLDER_SUMMARY_CLASS (camel_groupwise_summary_parent_class)->content_info_to_db (s, info, mir);
 	} else {
 		mir->cinfo = g_strdup ("0");
 		return 0;
@@ -335,7 +315,7 @@ gw_content_info_save (CamelFolderSummary *s, FILE *out,
 {
 	if (info->type) {
 		fputc (1, out);
-		return CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->content_info_save (s, out, info);
+		return CAMEL_FOLDER_SUMMARY_CLASS (camel_groupwise_summary_parent_class)->content_info_save (s, out, info);
 	} else
 		return fputc (0, out);
 }
diff --git a/camel/providers/groupwise/camel-groupwise-transport.c b/camel/providers/groupwise/camel-groupwise-transport.c
index 42cdb23..5c76ddd 100644
--- a/camel/providers/groupwise/camel-groupwise-transport.c
+++ b/camel/providers/groupwise/camel-groupwise-transport.c
@@ -42,7 +42,7 @@ static gboolean groupwise_send_to (CamelTransport *transport,
 				  CamelAddress *recipients,
 				  GError **error);
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelGroupwiseTransport, camel_groupwise_transport, CAMEL_TYPE_TRANSPORT)
 
 static gboolean
 groupwise_transport_connect (CamelService *service,
@@ -179,13 +179,11 @@ groupwise_send_to (CamelTransport *transport,
 }
 
 static void
-groupwise_transport_class_init (CamelGroupwiseTransportClass *class)
+camel_groupwise_transport_class_init (CamelGroupwiseTransportClass *class)
 {
 	CamelServiceClass *service_class;
 	CamelTransportClass *transport_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	service_class = CAMEL_SERVICE_CLASS (class);
 	service_class->connect = groupwise_transport_connect;
 	service_class->get_name = groupwise_transport_get_name;
@@ -194,20 +192,8 @@ groupwise_transport_class_init (CamelGroupwiseTransportClass *class)
 	transport_class->send_to = groupwise_send_to;
 }
 
-GType
-camel_groupwise_transport_get_type (void)
+static void
+camel_groupwise_transport_init (CamelGroupwiseTransport *groupwise_transport)
 {
-	static GType type = G_TYPE_INVALID;
-
-	if (type == G_TYPE_INVALID)
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_TRANSPORT,
-			"CamelGroupwiseTransport",
-			sizeof (CamelGroupwiseTransportClass),
-			(GClassInitFunc) groupwise_transport_class_init,
-			sizeof (CamelGroupwiseTransport),
-			(GInstanceInitFunc) NULL,
-			0);
-
-	return type;
 }
+
diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c
index a1a7fb3..ee07f6e 100644
--- a/camel/providers/imap/camel-imap-folder.c
+++ b/camel/providers/imap/camel-imap-folder.c
@@ -115,8 +115,6 @@ static void       imap_search_free          (CamelFolder *folder, GPtrArray *uid
 static void imap_thaw (CamelFolder *folder);
 static CamelFolderQuotaInfo *imap_get_quota_info (CamelFolder *folder);
 
-static gpointer parent_class;
-
 static GData *parse_fetch_response (CamelImapFolder *imap_folder, gchar *msg_att);
 
 /* internal helpers */
@@ -133,6 +131,8 @@ static CamelImapMessageInfo * imap_folder_summary_uid_or_error(
 #define strtok_r(s,sep,lasts) (*(lasts)=strtok((s),(sep)))
 #endif
 
+G_DEFINE_TYPE (CamelImapFolder, camel_imap_folder, CAMEL_TYPE_OFFLINE_FOLDER)
+
 static void
 imap_folder_dispose (GObject *object)
 {
@@ -162,7 +162,7 @@ imap_folder_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_imap_folder_parent_class)->dispose (object);
 }
 
 static void
@@ -178,18 +178,17 @@ imap_folder_finalize (GObject *object)
 #endif
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_imap_folder_parent_class)->finalize (object);
 }
 
 static void
-imap_folder_class_init (CamelImapFolderClass *class)
+camel_imap_folder_class_init (CamelImapFolderClass *class)
 {
 	GObjectClass *object_class;
 	CamelObjectClass *camel_object_class;
 	CamelFolderClass *folder_class;
 	gint i;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelImapFolderPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -224,7 +223,7 @@ imap_folder_class_init (CamelImapFolderClass *class)
 }
 
 static void
-imap_folder_init (CamelImapFolder *imap_folder)
+camel_imap_folder_init (CamelImapFolder *imap_folder)
 {
 	CamelFolder *folder = CAMEL_FOLDER (imap_folder);
 
@@ -246,24 +245,6 @@ imap_folder_init (CamelImapFolder *imap_folder)
 	imap_folder->need_rescan = TRUE;
 }
 
-GType
-camel_imap_folder_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (type == G_TYPE_INVALID)
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OFFLINE_FOLDER,
-			"CamelImapFolder",
-			sizeof (CamelImapFolderClass),
-			(GClassInitFunc) imap_folder_class_init,
-			sizeof (CamelImapFolder),
-			(GInstanceInitFunc) imap_folder_init,
-			0);
-
-	return type;
-}
-
 static void
 replay_offline_journal (CamelImapStore *imap_store, CamelImapFolder *imap_folder, GError **error)
 {
@@ -531,7 +512,7 @@ imap_getv(CamelObject *object, GError **error, CamelArgGetV *args)
 
 			props.argc = 1;
 			props.argv[0] = *arg;
-			((CamelObjectClass *)parent_class)->getv(object, error, &props);
+			((CamelObjectClass *)camel_imap_folder_parent_class)->getv(object, error, &props);
 
 			for (i = 0; i < G_N_ELEMENTS (imap_property_list); i++)
 				*arg->ca_ptr = g_slist_append (*arg->ca_ptr, &imap_property_list[i]);
@@ -560,7 +541,7 @@ imap_getv(CamelObject *object, GError **error, CamelArgGetV *args)
 	}
 
 	if (count)
-		return ((CamelObjectClass *)parent_class)->getv(object, error, args);
+		return ((CamelObjectClass *)camel_imap_folder_parent_class)->getv(object, error, args);
 
 	return 0;
 }
@@ -613,7 +594,7 @@ imap_setv (CamelObject *object, GError **error, CamelArgV *args)
 	if (save)
 		camel_object_state_write (object);
 
-	return ((CamelObjectClass *)parent_class)->setv (object, error, args);
+	return ((CamelObjectClass *)camel_imap_folder_parent_class)->setv (object, error, args);
 }
 
 static void
@@ -642,7 +623,7 @@ imap_rename (CamelFolder *folder, const gchar *new)
 	g_free(summary_path);
 	g_free(folder_dir);
 
-	CAMEL_FOLDER_CLASS (parent_class)->rename (folder, new);
+	CAMEL_FOLDER_CLASS (camel_imap_folder_parent_class)->rename (folder, new);
 }
 
 /* called with connect_lock locked */
@@ -3905,7 +3886,7 @@ imap_thaw (CamelFolder *folder)
 {
 	CamelImapFolder *imap_folder;
 
-	CAMEL_FOLDER_CLASS (parent_class)->thaw (folder);
+	CAMEL_FOLDER_CLASS (camel_imap_folder_parent_class)->thaw (folder);
 	if (camel_folder_is_frozen (folder))
 		return;
 
diff --git a/camel/providers/imap/camel-imap-journal.c b/camel/providers/imap/camel-imap-journal.c
index 38d21c0..030bd57 100644
--- a/camel/providers/imap/camel-imap-journal.c
+++ b/camel/providers/imap/camel-imap-journal.c
@@ -49,7 +49,7 @@ static void unref_folder (gpointer key, gpointer value, gpointer data);
 static void free_uids (GPtrArray *array);
 static void close_folder (gpointer name, gpointer folder, gpointer data);
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelIMAPJournal, camel_imap_journal, CAMEL_TYPE_OFFLINE_JOURNAL)
 
 static void
 free_uid (gpointer key, gpointer value, gpointer data)
@@ -75,17 +75,15 @@ imap_journal_finalize (GObject *object)
 	}
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_imap_journal_parent_class)->finalize (object);
 }
 
 static void
-imap_journal_class_init (CamelIMAPJournalClass *class)
+camel_imap_journal_class_init (CamelIMAPJournalClass *class)
 {
 	GObjectClass *object_class;
 	CamelOfflineJournalClass *offline_journal_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->finalize = imap_journal_finalize;
 
@@ -97,30 +95,12 @@ imap_journal_class_init (CamelIMAPJournalClass *class)
 }
 
 static void
-imap_journal_init (CamelIMAPJournal *journal)
+camel_imap_journal_init (CamelIMAPJournal *journal)
 {
 	journal->folders = g_hash_table_new (g_str_hash, g_str_equal);
 	journal->uidmap = g_hash_table_new (g_str_hash, g_str_equal);
 }
 
-GType
-camel_imap_journal_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OFFLINE_JOURNAL,
-			"CamelIMAPJournal",
-			sizeof (CamelIMAPJournalClass),
-			(GClassInitFunc) imap_journal_class_init,
-			sizeof (CamelIMAPJournal),
-			(GInstanceInitFunc) imap_journal_init,
-			0);
-
-	return type;
-}
-
 static void
 unref_folder (gpointer key, gpointer value, gpointer data)
 {
diff --git a/camel/providers/imap/camel-imap-message-cache.c b/camel/providers/imap/camel-imap-message-cache.c
index f200ec3..0f2abd2 100644
--- a/camel/providers/imap/camel-imap-message-cache.c
+++ b/camel/providers/imap/camel-imap-message-cache.c
@@ -47,8 +47,6 @@
 #define BASE_PART_SUFFIX "."
 #endif
 
-static gpointer parent_class;
-
 static void stream_finalize (CamelObject *stream, gpointer event_data, gpointer user_data);
 
 struct _part_find {
@@ -60,6 +58,8 @@ struct _part_find {
 	gint found;
 };
 
+G_DEFINE_TYPE (CamelImapMessageCache, camel_imap_message_cache, CAMEL_TYPE_OBJECT)
+
 static void
 free_part (gpointer key, gpointer value, gpointer data)
 {
@@ -92,36 +92,21 @@ imap_message_cache_finalize (GObject *object)
 		g_hash_table_destroy (cache->cached);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_imap_message_cache_parent_class)->finalize (object);
 }
 
 static void
-imap_message_cache_class_init (CamelImapMessageCacheClass *class)
+camel_imap_message_cache_class_init (CamelImapMessageCacheClass *class)
 {
 	GObjectClass *object_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->finalize = imap_message_cache_finalize;
 }
 
-GType
-camel_imap_message_cache_get_type (void)
+static void
+camel_imap_message_cache_init (CamelImapMessageCache *imap_message_cache)
 {
-	static GType type = G_TYPE_INVALID;
-
-	if (type == G_TYPE_INVALID)
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OBJECT,
-			"CamelImapMessageCache",
-			sizeof (CamelImapMessageCacheClass),
-			(GClassInitFunc) imap_message_cache_class_init,
-			sizeof (CamelImapMessageCache),
-			(GInstanceInitFunc) NULL,
-			0);
-
-	return type;
 }
 
 static void
diff --git a/camel/providers/imap/camel-imap-search.c b/camel/providers/imap/camel-imap-search.c
index b49f2ab..1ea7ef9 100644
--- a/camel/providers/imap/camel-imap-search.c
+++ b/camel/providers/imap/camel-imap-search.c
@@ -93,7 +93,7 @@ struct _match_record {
 
 static ESExpResult *imap_body_contains (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *s);
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelImapSearch, camel_imap_search, CAMEL_TYPE_FOLDER_SEARCH)
 
 static void
 free_match(CamelImapSearch *is, struct _match_record *mr)
@@ -120,7 +120,7 @@ imap_search_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_imap_search_parent_class)->dispose (object);
 }
 
 static void
@@ -137,17 +137,15 @@ imap_search_finalize (GObject *object)
 	g_hash_table_destroy (search->matches_hash);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_imap_search_parent_class)->finalize (object);
 }
 
 static void
-imap_search_class_init (CamelImapSearchClass *class)
+camel_imap_search_class_init (CamelImapSearchClass *class)
 {
 	GObjectClass *object_class;
 	CamelFolderSearchClass *folder_search_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->dispose = imap_search_dispose;
 	object_class->finalize = imap_search_finalize;
@@ -157,7 +155,7 @@ imap_search_class_init (CamelImapSearchClass *class)
 }
 
 static void
-imap_search_init (CamelImapSearch *is)
+camel_imap_search_init (CamelImapSearch *is)
 {
 	camel_dlist_init(&is->matches);
 	is->matches_hash = g_hash_table_new(g_str_hash, g_str_equal);
@@ -165,24 +163,6 @@ imap_search_init (CamelImapSearch *is)
 	is->lastuid = 0;
 }
 
-GType
-camel_imap_search_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (type == G_TYPE_INVALID)
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_FOLDER_SEARCH,
-			"CamelImapSearch",
-			sizeof (CamelImapSearchClass),
-			(GClassInitFunc) imap_search_class_init,
-			sizeof (CamelImapSearch),
-			(GInstanceInitFunc) imap_search_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_imap_search_new:
  *
@@ -459,7 +439,7 @@ imap_body_contains (struct _ESExp *f, gint argc, struct _ESExpResult **argv, Cam
 
 	/* If offline, search using the parent class, which can handle this manually */
 	if (CAMEL_OFFLINE_STORE (store)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL)
-		return CAMEL_FOLDER_SEARCH_CLASS (parent_class)->body_contains(f, argc, argv, s);
+		return CAMEL_FOLDER_SEARCH_CLASS (camel_imap_search_parent_class)->body_contains(f, argc, argv, s);
 
 	/* optimise the match "" case - match everything */
 	if (argc == 1 && argv[0]->value.string[0] == '\0') {
diff --git a/camel/providers/imap/camel-imap-store-summary.c b/camel/providers/imap/camel-imap-store-summary.c
index 0f871ca..c61a310 100644
--- a/camel/providers/imap/camel-imap-store-summary.c
+++ b/camel/providers/imap/camel-imap-store-summary.c
@@ -51,15 +51,13 @@ static void		 store_info_free(CamelStoreSummary *, CamelStoreInfo *);
 static const gchar *store_info_string(CamelStoreSummary *, const CamelStoreInfo *, gint);
 static void store_info_set_string(CamelStoreSummary *, CamelStoreInfo *, int, const gchar *);
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelImapStoreSummary, camel_imap_store_summary, CAMEL_TYPE_STORE_SUMMARY)
 
 static void
-imap_store_summary_class_init (CamelImapStoreSummaryClass *class)
+camel_imap_store_summary_class_init (CamelImapStoreSummaryClass *class)
 {
 	CamelStoreSummaryClass *store_summary_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	store_summary_class = CAMEL_STORE_SUMMARY_CLASS (class);
 	store_summary_class->summary_header_load = summary_header_load;
 	store_summary_class->summary_header_save = summary_header_save;
@@ -72,7 +70,7 @@ imap_store_summary_class_init (CamelImapStoreSummaryClass *class)
 }
 
 static void
-imap_store_summary_init (CamelImapStoreSummary *imap_store_summary)
+camel_imap_store_summary_init (CamelImapStoreSummary *imap_store_summary)
 {
 	CamelStoreSummary *store_summary;
 
@@ -82,24 +80,6 @@ imap_store_summary_init (CamelImapStoreSummary *imap_store_summary)
 	imap_store_summary->version = CAMEL_IMAP_STORE_SUMMARY_VERSION;
 }
 
-GType
-camel_imap_store_summary_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_STORE_SUMMARY,
-			"CamelImapStoreSummary",
-			sizeof (CamelImapStoreSummaryClass),
-			(GClassInitFunc) imap_store_summary_class_init,
-			sizeof (CamelImapStoreSummary),
-			(GInstanceInitFunc) imap_store_summary_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_imap_store_summary_new:
  *
@@ -572,7 +552,7 @@ summary_header_load(CamelStoreSummary *s, FILE *in)
 
 	namespace_clear (is);
 
-	if (CAMEL_STORE_SUMMARY_CLASS (parent_class)->summary_header_load((CamelStoreSummary *)s, in) == -1
+	if (CAMEL_STORE_SUMMARY_CLASS (camel_imap_store_summary_parent_class)->summary_header_load((CamelStoreSummary *)s, in) == -1
 	    || camel_file_util_decode_fixed_int32(in, &version) == -1)
 		return -1;
 
@@ -608,7 +588,7 @@ summary_header_save(CamelStoreSummary *s, FILE *out)
 	}
 
 	/* always write as latest version */
-	if (CAMEL_STORE_SUMMARY_CLASS (parent_class)->summary_header_save((CamelStoreSummary *)s, out) == -1
+	if (CAMEL_STORE_SUMMARY_CLASS (camel_imap_store_summary_parent_class)->summary_header_save((CamelStoreSummary *)s, out) == -1
 	    || camel_file_util_encode_fixed_int32(out, CAMEL_IMAP_STORE_SUMMARY_VERSION) == -1
 	    || camel_file_util_encode_fixed_int32(out, is->capabilities) == -1
 	    || camel_file_util_encode_fixed_int32(out, count) == -1)
@@ -625,7 +605,7 @@ store_info_load(CamelStoreSummary *s, FILE *in)
 {
 	CamelImapStoreInfo *mi;
 
-	mi = (CamelImapStoreInfo *) CAMEL_STORE_SUMMARY_CLASS (parent_class)->store_info_load(s, in);
+	mi = (CamelImapStoreInfo *) CAMEL_STORE_SUMMARY_CLASS (camel_imap_store_summary_parent_class)->store_info_load(s, in);
 	if (mi) {
 		if (camel_file_util_decode_string(in, &mi->full_name) == -1) {
 			camel_store_summary_info_free(s, (CamelStoreInfo *)mi);
@@ -645,7 +625,7 @@ store_info_save(CamelStoreSummary *s, FILE *out, CamelStoreInfo *mi)
 {
 	CamelImapStoreInfo *isi = (CamelImapStoreInfo *)mi;
 
-	if (CAMEL_STORE_SUMMARY_CLASS (parent_class)->store_info_save(s, out, mi) == -1
+	if (CAMEL_STORE_SUMMARY_CLASS (camel_imap_store_summary_parent_class)->store_info_save(s, out, mi) == -1
 	    || camel_file_util_encode_string(out, isi->full_name) == -1)
 		return -1;
 
@@ -658,7 +638,7 @@ store_info_free(CamelStoreSummary *s, CamelStoreInfo *mi)
 	CamelImapStoreInfo *isi = (CamelImapStoreInfo *)mi;
 
 	g_free(isi->full_name);
-	CAMEL_STORE_SUMMARY_CLASS (parent_class)->store_info_free(s, mi);
+	CAMEL_STORE_SUMMARY_CLASS (camel_imap_store_summary_parent_class)->store_info_free(s, mi);
 }
 
 static const gchar *
@@ -674,7 +654,7 @@ store_info_string(CamelStoreSummary *s, const CamelStoreInfo *mi, gint type)
 	case CAMEL_IMAP_STORE_INFO_FULL_NAME:
 		return isi->full_name;
 	default:
-		return CAMEL_STORE_SUMMARY_CLASS (parent_class)->store_info_string(s, mi, type);
+		return CAMEL_STORE_SUMMARY_CLASS (camel_imap_store_summary_parent_class)->store_info_string(s, mi, type);
 	}
 }
 
@@ -694,7 +674,7 @@ store_info_set_string(CamelStoreSummary *s, CamelStoreInfo *mi, gint type, const
 		CAMEL_STORE_SUMMARY_UNLOCK(s, summary_lock);
 		break;
 	default:
-		CAMEL_STORE_SUMMARY_CLASS (parent_class)->store_info_set_string(s, mi, type, str);
+		CAMEL_STORE_SUMMARY_CLASS (camel_imap_store_summary_parent_class)->store_info_set_string(s, mi, type, str);
 		break;
 	}
 }
diff --git a/camel/providers/imap/camel-imap-store.c b/camel/providers/imap/camel-imap-store.c
index 6b1da66..5abfb54 100644
--- a/camel/providers/imap/camel-imap-store.c
+++ b/camel/providers/imap/camel-imap-store.c
@@ -59,8 +59,6 @@
 #define strtok_r(s,sep,lasts) (*(lasts)=strtok((s),(sep)))
 #endif
 
-static gpointer parent_class;
-
 static gchar imap_tag_prefix = 'A';
 
 static gboolean construct (CamelService *service, CamelSession *session,
@@ -103,6 +101,8 @@ static CamelFolderInfo * get_folder_info (CamelStore *store, const gchar *top, g
 static CamelFolder * get_folder_offline (CamelStore *store, const gchar *folder_name, guint32 flags, GError **error);
 static CamelFolderInfo * get_folder_info_offline (CamelStore *store, const gchar *top, guint32 flags, GError **error);
 
+G_DEFINE_TYPE (CamelImapStore, camel_imap_store, CAMEL_TYPE_OFFLINE_STORE)
+
 static gboolean
 free_key (gpointer key, gpointer value, gpointer user_data)
 {
@@ -123,7 +123,7 @@ imap_store_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_imap_store_parent_class)->dispose (object);
 }
 
 static void
@@ -140,19 +140,17 @@ imap_store_finalize (GObject *object)
 	g_free (imap_store->custom_headers);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_imap_store_parent_class)->finalize (object);
 }
 
 static void
-imap_store_class_init (CamelImapStoreClass *class)
+camel_imap_store_class_init (CamelImapStoreClass *class)
 {
 	GObjectClass *object_class;
 	CamelObjectClass *camel_object_class;
 	CamelServiceClass *service_class;
 	CamelStoreClass *store_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->dispose = imap_store_dispose;
 	object_class->finalize = imap_store_finalize;
@@ -187,7 +185,7 @@ imap_store_class_init (CamelImapStoreClass *class)
 }
 
 static void
-imap_store_init (CamelImapStore *imap_store)
+camel_imap_store_init (CamelImapStore *imap_store)
 {
 	imap_store->istream = NULL;
 	imap_store->ostream = NULL;
@@ -204,24 +202,6 @@ imap_store_init (CamelImapStore *imap_store)
 		imap_tag_prefix = 'A';
 }
 
-GType
-camel_imap_store_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (type == G_TYPE_INVALID)
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OFFLINE_STORE,
-			"CamelImapStore",
-			sizeof (CamelImapStoreClass),
-			(GClassInitFunc) imap_store_class_init,
-			sizeof (CamelImapStore),
-			(GInstanceInitFunc) imap_store_init,
-			0);
-
-	return type;
-}
-
 static gboolean
 construct (CamelService *service, CamelSession *session,
 	   CamelProvider *provider, CamelURL *url,
@@ -234,7 +214,7 @@ construct (CamelService *service, CamelSession *session,
 	CamelURL *summary_url;
 
 	/* Chain up to parent's construct() method. */
-	service_class = CAMEL_SERVICE_CLASS (parent_class);
+	service_class = CAMEL_SERVICE_CLASS (camel_imap_store_parent_class);
 	if (!service_class->construct (service, session, provider, url, error))
 		return FALSE;
 
@@ -374,7 +354,7 @@ imap_setv (CamelObject *object, GError **error, CamelArgV *args)
            we need to do it here... or, better yet, somehow chain it
            up to CamelService's setv implementation. */
 
-	return CAMEL_OBJECT_CLASS (parent_class)->setv (object, error, args);
+	return CAMEL_OBJECT_CLASS (camel_imap_store_parent_class)->setv (object, error, args);
 }
 
 static gint
@@ -420,7 +400,7 @@ imap_getv (CamelObject *object, GError **error, CamelArgGetV *args)
 		}
 	}
 
-	return CAMEL_OBJECT_CLASS (parent_class)->getv (object, error, args);
+	return CAMEL_OBJECT_CLASS (camel_imap_store_parent_class)->getv (object, error, args);
 }
 
 static gchar *
@@ -1685,7 +1665,7 @@ done:
 static CamelFolder *
 imap_get_trash(CamelStore *store, GError **error)
 {
-	CamelFolder *folder = CAMEL_STORE_CLASS(parent_class)->get_trash(store, error);
+	CamelFolder *folder = CAMEL_STORE_CLASS(camel_imap_store_parent_class)->get_trash(store, error);
 
 	if (folder) {
 		gchar *state = g_build_filename(((CamelImapStore *)store)->storage_path, "system", "Trash.cmeta", NULL);
@@ -1702,7 +1682,7 @@ imap_get_trash(CamelStore *store, GError **error)
 static CamelFolder *
 imap_get_junk(CamelStore *store, GError **error)
 {
-	CamelFolder *folder = CAMEL_STORE_CLASS(parent_class)->get_junk(store, error);
+	CamelFolder *folder = CAMEL_STORE_CLASS(camel_imap_store_parent_class)->get_junk(store, error);
 
 	if (folder) {
 		gchar *state = g_build_filename(((CamelImapStore *)store)->storage_path, "system", "Junk.cmeta", NULL);
@@ -3223,7 +3203,7 @@ imap_can_refresh_folder (CamelStore *store,
 	GError *local_error = NULL;
 	gboolean res;
 
-	res = CAMEL_STORE_CLASS(parent_class)->can_refresh_folder (store, info, &local_error) ||
+	res = CAMEL_STORE_CLASS(camel_imap_store_parent_class)->can_refresh_folder (store, info, &local_error) ||
 	      (camel_url_get_param (((CamelService *)store)->url, "check_all") != NULL) ||
 	      (camel_url_get_param (((CamelService *)store)->url, "check_lsub") != NULL && (info->flags & CAMEL_FOLDER_SUBSCRIBED) != 0);
 
diff --git a/camel/providers/imap/camel-imap-summary.c b/camel/providers/imap/camel-imap-summary.c
index 9ee535c..e298cc0 100644
--- a/camel/providers/imap/camel-imap-summary.c
+++ b/camel/providers/imap/camel-imap-summary.c
@@ -57,7 +57,7 @@ static CamelMessageInfo * message_info_from_db (CamelFolderSummary *s, CamelMIRe
 static gint content_info_to_db (CamelFolderSummary *s, CamelMessageContentInfo *info, CamelMIRecord *mir);
 static CamelMessageContentInfo * content_info_from_db (CamelFolderSummary *s, CamelMIRecord *mir);
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelImapSummary, camel_imap_summary, CAMEL_TYPE_FOLDER_SUMMARY)
 
 static CamelMessageInfo *
 imap_message_info_clone(CamelFolderSummary *s, const CamelMessageInfo *mi)
@@ -65,7 +65,7 @@ imap_message_info_clone(CamelFolderSummary *s, const CamelMessageInfo *mi)
 	CamelImapMessageInfo *to;
 	const CamelImapMessageInfo *from = (const CamelImapMessageInfo *)mi;
 
-	to = (CamelImapMessageInfo *) CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->message_info_clone(s, mi);
+	to = (CamelImapMessageInfo *) CAMEL_FOLDER_SUMMARY_CLASS (camel_imap_summary_parent_class)->message_info_clone(s, mi);
 	to->server_flags = from->server_flags;
 
 	/* FIXME: parent clone should do this */
@@ -75,12 +75,10 @@ imap_message_info_clone(CamelFolderSummary *s, const CamelMessageInfo *mi)
 }
 
 static void
-imap_summary_class_init (CamelImapSummaryClass *class)
+camel_imap_summary_class_init (CamelImapSummaryClass *class)
 {
 	CamelFolderSummaryClass *folder_summary_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	folder_summary_class = CAMEL_FOLDER_SUMMARY_CLASS (class);
 	folder_summary_class->message_info_size = sizeof (CamelImapMessageInfo);
 	folder_summary_class->content_info_size = sizeof (CamelImapMessageContentInfo);
@@ -100,22 +98,9 @@ imap_summary_class_init (CamelImapSummaryClass *class)
 	folder_summary_class->info_set_user_flag = info_set_user_flag;
 }
 
-GType
-camel_imap_summary_get_type (void)
+static void
+camel_imap_summary_init (CamelImapSummary *imap_summary)
 {
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_FOLDER_SUMMARY,
-			"CamelImapSummary",
-			sizeof (CamelImapSummaryClass),
-			(GClassInitFunc) imap_summary_class_init,
-			sizeof (CamelImapSummary),
-			(GInstanceInitFunc) NULL,
-			0);
-
-	return type;
 }
 
 static gint
@@ -206,7 +191,7 @@ summary_header_from_db (CamelFolderSummary *s, CamelFIRecord *mir)
 	CamelImapSummary *ims = CAMEL_IMAP_SUMMARY (s);
 	gchar *part;
 
-	if (CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->summary_header_from_db (s, mir) == -1)
+	if (CAMEL_FOLDER_SUMMARY_CLASS (camel_imap_summary_parent_class)->summary_header_from_db (s, mir) == -1)
 		return -1;
 
 	part = mir->bdata;
@@ -233,7 +218,7 @@ summary_header_load (CamelFolderSummary *s, FILE *in)
 {
 	CamelImapSummary *ims = CAMEL_IMAP_SUMMARY (s);
 
-	if (CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->summary_header_load (s, in) == -1)
+	if (CAMEL_FOLDER_SUMMARY_CLASS (camel_imap_summary_parent_class)->summary_header_load (s, in) == -1)
 		return -1;
 
 	/* Legacy version */
@@ -270,7 +255,7 @@ summary_header_to_db (CamelFolderSummary *s, GError **error)
 	CamelImapSummary *ims = CAMEL_IMAP_SUMMARY(s);
 	struct _CamelFIRecord *fir;
 
-	fir = CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->summary_header_to_db (s, error);
+	fir = CAMEL_FOLDER_SUMMARY_CLASS (camel_imap_summary_parent_class)->summary_header_to_db (s, error);
 	if (!fir)
 		return NULL;
 	fir->bdata = g_strdup_printf ("%d %u", CAMEL_IMAP_SUMMARY_VERSION, ims->validity);
@@ -283,7 +268,7 @@ summary_header_save (CamelFolderSummary *s, FILE *out)
 {
 	CamelImapSummary *ims = CAMEL_IMAP_SUMMARY(s);
 
-	if (CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->summary_header_save (s, out) == -1)
+	if (CAMEL_FOLDER_SUMMARY_CLASS (camel_imap_summary_parent_class)->summary_header_save (s, out) == -1)
 		return -1;
 
 	camel_file_util_encode_fixed_int32(out, CAMEL_IMAP_SUMMARY_VERSION);
@@ -297,7 +282,7 @@ message_info_from_db (CamelFolderSummary *s, CamelMIRecord *mir)
 	CamelMessageInfo *info;
 	CamelImapMessageInfo *iinfo;
 
-	info = CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->message_info_from_db (s, mir);
+	info = CAMEL_FOLDER_SUMMARY_CLASS (camel_imap_summary_parent_class)->message_info_from_db (s, mir);
 	if (info) {
 		gchar *part = g_strdup (mir->bdata), *tmp;
 		tmp = part;
@@ -315,7 +300,7 @@ message_info_load (CamelFolderSummary *s, FILE *in)
 	CamelMessageInfo *info;
 	CamelImapMessageInfo *iinfo;
 
-	info = CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->message_info_load (s, in);
+	info = CAMEL_FOLDER_SUMMARY_CLASS (camel_imap_summary_parent_class)->message_info_load (s, in);
 	if (info) {
 		iinfo = (CamelImapMessageInfo *)info;
 
@@ -335,7 +320,7 @@ message_info_to_db (CamelFolderSummary *s, CamelMessageInfo *info)
 	CamelImapMessageInfo *iinfo = (CamelImapMessageInfo *)info;
 	struct _CamelMIRecord *mir;
 
-	mir = CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->message_info_to_db (s, info);
+	mir = CAMEL_FOLDER_SUMMARY_CLASS (camel_imap_summary_parent_class)->message_info_to_db (s, info);
 	if (mir)
 		mir->bdata = g_strdup_printf ("%u", iinfo->server_flags);
 
@@ -347,7 +332,7 @@ message_info_save (CamelFolderSummary *s, FILE *out, CamelMessageInfo *info)
 {
 	CamelImapMessageInfo *iinfo = (CamelImapMessageInfo *)info;
 
-	if (CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->message_info_save (s, out, info) == -1)
+	if (CAMEL_FOLDER_SUMMARY_CLASS (camel_imap_summary_parent_class)->message_info_save (s, out, info) == -1)
 		return -1;
 
 	return camel_file_util_encode_uint32 (out, iinfo->server_flags);
@@ -358,7 +343,7 @@ info_set_user_flag (CamelMessageInfo *info, const gchar *id, gboolean state)
 {
 	gboolean res;
 
-	res = CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->info_set_user_flag (info, id, state);
+	res = CAMEL_FOLDER_SUMMARY_CLASS (camel_imap_summary_parent_class)->info_set_user_flag (info, id, state);
 
 	/* there was a change, so do not forget to store it to server */
 	if (res)
@@ -382,7 +367,7 @@ content_info_from_db (CamelFolderSummary *s, CamelMIRecord *mir)
 	}
 	mir->cinfo = part;
 	if (type)
-		return CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->content_info_from_db (s, mir);
+		return CAMEL_FOLDER_SUMMARY_CLASS (camel_imap_summary_parent_class)->content_info_from_db (s, mir);
 	else
 		return camel_folder_summary_content_info_new (s);
 }
@@ -391,7 +376,7 @@ static CamelMessageContentInfo *
 content_info_load (CamelFolderSummary *s, FILE *in)
 {
 	if (fgetc (in))
-		return CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->content_info_load (s, in);
+		return CAMEL_FOLDER_SUMMARY_CLASS (camel_imap_summary_parent_class)->content_info_load (s, in);
 	else
 		return camel_folder_summary_content_info_new (s);
 }
@@ -404,7 +389,7 @@ content_info_to_db (CamelFolderSummary *s, CamelMessageContentInfo *info, CamelM
 		oldr = mir->cinfo;
 		mir->cinfo = oldr ? g_strdup_printf("%s 1", oldr) : g_strdup ("1");
 		g_free(oldr);
-		return CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->content_info_to_db (s, info, mir);
+		return CAMEL_FOLDER_SUMMARY_CLASS (camel_imap_summary_parent_class)->content_info_to_db (s, info, mir);
 	} else {
 		oldr = mir->cinfo;
 		mir->cinfo = oldr ? g_strdup_printf("%s 0", oldr) : g_strdup ("0");
@@ -419,7 +404,7 @@ content_info_save (CamelFolderSummary *s, FILE *out,
 {
 	if (info->type) {
 		fputc (1, out);
-		return CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->content_info_save (s, out, info);
+		return CAMEL_FOLDER_SUMMARY_CLASS (camel_imap_summary_parent_class)->content_info_save (s, out, info);
 	} else
 		return fputc (0, out);
 }
diff --git a/camel/providers/imap/camel-imap-wrapper.c b/camel/providers/imap/camel-imap-wrapper.c
index 5143c7c..6b87bb4 100644
--- a/camel/providers/imap/camel-imap-wrapper.c
+++ b/camel/providers/imap/camel-imap-wrapper.c
@@ -42,7 +42,7 @@ struct _CamelImapWrapperPrivate {
 #define CAMEL_IMAP_WRAPPER_LOCK(f, l) (g_mutex_lock(((CamelImapWrapper *)f)->priv->l))
 #define CAMEL_IMAP_WRAPPER_UNLOCK(f, l) (g_mutex_unlock(((CamelImapWrapper *)f)->priv->l))
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelImapWrapper, camel_imap_wrapper, CAMEL_TYPE_DATA_WRAPPER)
 
 static void
 imap_wrapper_hydrate (CamelImapWrapper *imap_wrapper,
@@ -73,7 +73,7 @@ imap_wrapper_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_imap_wrapper_parent_class)->dispose (object);
 }
 
 static void
@@ -87,7 +87,7 @@ imap_wrapper_finalize (GObject *object)
 	g_mutex_free (imap_wrapper->priv->lock);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_imap_wrapper_parent_class)->finalize (object);
 }
 
 static gssize
@@ -121,17 +121,16 @@ imap_wrapper_write_to_stream (CamelDataWrapper *data_wrapper,
 	}
 	CAMEL_IMAP_WRAPPER_UNLOCK (imap_wrapper, lock);
 
-	return CAMEL_DATA_WRAPPER_CLASS (parent_class)->
+	return CAMEL_DATA_WRAPPER_CLASS (camel_imap_wrapper_parent_class)->
 		write_to_stream (data_wrapper, stream, error);
 }
 
 static void
-imap_wrapper_class_init (CamelImapWrapperClass *class)
+camel_imap_wrapper_class_init (CamelImapWrapperClass *class)
 {
 	GObjectClass *object_class;
 	CamelDataWrapperClass *data_wrapper_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelImapWrapperPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -143,30 +142,12 @@ imap_wrapper_class_init (CamelImapWrapperClass *class)
 }
 
 static void
-imap_wrapper_init (CamelImapWrapper *imap_wrapper)
+camel_imap_wrapper_init (CamelImapWrapper *imap_wrapper)
 {
 	imap_wrapper->priv = CAMEL_IMAP_WRAPPER_GET_PRIVATE (imap_wrapper);
 	imap_wrapper->priv->lock = g_mutex_new ();
 }
 
-GType
-camel_imap_wrapper_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_DATA_WRAPPER,
-			"CamelImapWrapper",
-			sizeof (CamelImapWrapperClass),
-			(GClassInitFunc) imap_wrapper_class_init,
-			sizeof (CamelImapWrapper),
-			(GInstanceInitFunc) imap_wrapper_init,
-			0);
-
-	return type;
-}
-
 CamelDataWrapper *
 camel_imap_wrapper_new (CamelImapFolder *imap_folder,
 			CamelContentType *type, CamelTransferEncoding encoding,
diff --git a/camel/providers/imap4/camel-imap4-engine.c b/camel/providers/imap4/camel-imap4-engine.c
index dfb818b..87c438e 100644
--- a/camel/providers/imap4/camel-imap4-engine.c
+++ b/camel/providers/imap4/camel-imap4-engine.c
@@ -45,8 +45,6 @@ static void imap4_engine_finalize (CamelObject *object);
 static gint parse_xgwextensions (CamelIMAP4Engine *engine, CamelIMAP4Command *ic, guint32 index,
 				camel_imap4_token_t *token, GError **error);
 
-static gpointer parent_class;
-
 GType
 camel_imap4_engine_get_type (void)
 {
@@ -69,8 +67,6 @@ camel_imap4_engine_get_type (void)
 static void
 camel_imap4_engine_class_init (CamelIMAP4EngineClass *class)
 {
-	parent_class = g_type_class_peek_parent (class);
-
 	class->tagprefix = 'A';
 }
 
diff --git a/camel/providers/imap4/camel-imap4-folder.c b/camel/providers/imap4/camel-imap4-folder.c
index 48362a9..3c974ae 100644
--- a/camel/providers/imap4/camel-imap4-folder.c
+++ b/camel/providers/imap4/camel-imap4-folder.c
@@ -70,8 +70,6 @@ static GPtrArray *imap4_search_by_uids (CamelFolder *folder, const gchar *expr,
 static void imap4_search_free (CamelFolder *folder, GPtrArray *uids);
 static gchar * imap4_get_filename (CamelFolder *folder, const gchar *uid, GError **error);
 
-static gpointer parent_class;
-
 static GSList *imap4_folder_props = NULL;
 
 static CamelProperty imap4_prop_list[] = {
@@ -106,8 +104,6 @@ camel_imap4_folder_class_init (CamelIMAP4FolderClass *class)
 	CamelObjectClass *object_class = (CamelObjectClass *) class;
 	gint i;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	if (imap4_folder_props == NULL) {
 		for (i = 0; i < G_N_ELEMENTS (imap4_prop_list); i++) {
 			imap4_prop_list[i].description = _(imap4_prop_list[i].description);
@@ -185,7 +181,7 @@ imap4_getv (CamelObject *object, GError **error, CamelArgGetV *args)
 		case CAMEL_FOLDER_ARG_PROPERTIES:
 			props.argc = 1;
 			props.argv[0] = *arg;
-			((CamelObjectClass *) parent_class)->getv (object, ex, &props);
+			((CamelObjectClass *) camel_imap4_folder_parent_class)->getv (object, ex, &props);
 			*arg->ca_ptr = g_slist_concat (*arg->ca_ptr, g_slist_copy (imap4_folder_props));
 			break;
 		case CAMEL_IMAP4_FOLDER_ARG_ENABLE_MLIST:
@@ -206,7 +202,7 @@ imap4_getv (CamelObject *object, GError **error, CamelArgGetV *args)
 	}
 
 	if (count)
-		return ((CamelObjectClass *) parent_class)->getv (object, ex, args);
+		return ((CamelObjectClass *) camel_imap4_folder_parent_class)->getv (object, ex, args);
 
 	return 0;
 }
@@ -254,7 +250,7 @@ imap4_setv (CamelObject *object, GError **error, CamelArgV *args)
 	if (save)
 		camel_object_state_write (object);
 
-	return ((CamelObjectClass *) parent_class)->setv (object, ex, args);
+	return ((CamelObjectClass *) camel_imap4_folder_parent_class)->setv (object, ex, args);
 }
 
 static gchar *
diff --git a/camel/providers/imap4/camel-imap4-journal.c b/camel/providers/imap4/camel-imap4-journal.c
index 79bfc08..18189dd 100644
--- a/camel/providers/imap4/camel-imap4-journal.c
+++ b/camel/providers/imap4/camel-imap4-journal.c
@@ -48,8 +48,6 @@ static CamelDListNode *imap4_entry_load (CamelOfflineJournal *journal, FILE *in)
 static gint imap4_entry_write (CamelOfflineJournal *journal, CamelDListNode *entry, FILE *out);
 static gint imap4_entry_play (CamelOfflineJournal *journal, CamelDListNode *entry, GError **error);
 
-static gpointer parent_class;
-
 GType
 camel_imap4_journal_get_type (void)
 {
@@ -74,8 +72,6 @@ camel_imap4_journal_class_init (CamelIMAP4JournalClass *class)
 {
 	CamelOfflineJournalClass *journal_class = (CamelOfflineJournalClass *) class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	journal_class->entry_free = imap4_entry_free;
 	journal_class->entry_load = imap4_entry_load;
 	journal_class->entry_write = imap4_entry_write;
diff --git a/camel/providers/imap4/camel-imap4-search.c b/camel/providers/imap4/camel-imap4-search.c
index 9504afc..803ffa8 100644
--- a/camel/providers/imap4/camel-imap4-search.c
+++ b/camel/providers/imap4/camel-imap4-search.c
@@ -39,8 +39,6 @@ static void imap4_search_finalize (CamelObject *object);
 
 static ESExpResult *imap4_body_contains (struct _ESExp *f, gint argc, struct _ESExpResult **argv, CamelFolderSearch *search);
 
-static gpointer parent_class;
-
 GType
 camel_imap4_search_get_type (void)
 {
@@ -65,8 +63,6 @@ camel_imap4_search_class_init (CamelIMAP4SearchClass *class)
 {
 	CamelFolderSearchClass *search_class = (CamelFolderSearchClass *) class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	search_class->body_contains = imap4_body_contains;
 }
 
@@ -146,7 +142,7 @@ imap4_body_contains (struct _ESExp *f, gint argc, struct _ESExpResult **argv, Ca
 	gchar *set;
 
 	if (((CamelOfflineStore *) engine->service)->state == CAMEL_OFFLINE_STORE_NETWORK_UNAVAIL)
-		return parent_class->body_contains (f, argc, argv, search);
+		return camel_imap4_search_parent_class->body_contains (f, argc, argv, search);
 
 	summary_set = search->summary_set ? search->summary_set : search->summary;
 
diff --git a/camel/providers/imap4/camel-imap4-store-summary.c b/camel/providers/imap4/camel-imap4-store-summary.c
index d87c197..cb6df5d 100644
--- a/camel/providers/imap4/camel-imap4-store-summary.c
+++ b/camel/providers/imap4/camel-imap4-store-summary.c
@@ -48,8 +48,6 @@ static CamelStoreInfo *store_info_load (CamelStoreSummary *s, FILE *in);
 static gint store_info_save (CamelStoreSummary *s, FILE *out, CamelStoreInfo *info);
 static void store_info_free (CamelStoreSummary *s, CamelStoreInfo *info);
 
-static gpointer parent_class;
-
 GType
 camel_imap4_store_summary_get_type (void)
 {
@@ -74,8 +72,6 @@ camel_imap4_store_summary_class_init (CamelIMAP4StoreSummaryClass *class)
 {
 	CamelStoreSummaryClass *ssclass = (CamelStoreSummaryClass *) class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	ssclass->summary_header_load = summary_header_load;
 	ssclass->summary_header_save = summary_header_save;
 
@@ -164,7 +160,7 @@ summary_header_load (CamelStoreSummary *s, FILE *in)
 	CamelIMAP4StoreSummary *is = (CamelIMAP4StoreSummary *) s;
 	guint32 version, capa;
 
-	if (parent_class->summary_header_load (s, in) == -1)
+	if (camel_imap4_store_summary_parent_class->summary_header_load (s, in) == -1)
 		return -1;
 
 	if (camel_file_util_decode_fixed_int32 (in, &version) == -1)
@@ -233,7 +229,7 @@ summary_header_save (CamelStoreSummary *s, FILE *out)
 {
 	CamelIMAP4StoreSummary *is = (CamelIMAP4StoreSummary *) s;
 
-	if (parent_class->summary_header_save (s, out) == -1)
+	if (camel_imap4_store_summary_parent_class->summary_header_save (s, out) == -1)
 		return -1;
 
 	if (camel_file_util_encode_fixed_int32 (out, is->version) == -1)
@@ -251,19 +247,19 @@ summary_header_save (CamelStoreSummary *s, FILE *out)
 static CamelStoreInfo *
 store_info_load (CamelStoreSummary *s, FILE *in)
 {
-	return parent_class->store_info_load (s, in);
+	return camel_imap4_store_summary_parent_class->store_info_load (s, in);
 }
 
 static gint
 store_info_save (CamelStoreSummary *s, FILE *out, CamelStoreInfo *info)
 {
-	return parent_class->store_info_save (s, out, info);
+	return camel_imap4_store_summary_parent_class->store_info_save (s, out, info);
 }
 
 static void
 store_info_free (CamelStoreSummary *s, CamelStoreInfo *info)
 {
-	parent_class->store_info_free (s, info);
+	camel_imap4_store_summary_parent_class->store_info_free (s, info);
 }
 
 /**
diff --git a/camel/providers/imap4/camel-imap4-store.c b/camel/providers/imap4/camel-imap4-store.c
index f2ee621..c85494c 100644
--- a/camel/providers/imap4/camel-imap4-store.c
+++ b/camel/providers/imap4/camel-imap4-store.c
@@ -67,8 +67,6 @@ static void imap4_unsubscribe_folder (CamelStore *store, const gchar *folder_nam
 static gboolean imap4_folder_subscribed (CamelStore *store, const gchar *folder_name);
 static void imap4_noop (CamelStore *store, GError **error);
 
-static gpointer parent_class;
-
 GType
 camel_imap4_store_get_type (void)
 {
@@ -116,8 +114,6 @@ camel_imap4_store_class_init (CamelIMAP4StoreClass *class)
 	CamelServiceClass *service_class = (CamelServiceClass *) class;
 	CamelStoreClass *store_class = (CamelStoreClass *) class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	service_class->construct = imap4_construct;
 	service_class->get_name = imap4_get_name;
 	service_class->connect = imap4_connect;
@@ -168,7 +164,7 @@ imap4_construct (CamelService *service, CamelSession *session, CamelProvider *pr
 	CamelIMAP4Store *store = (CamelIMAP4Store *) service;
 	gchar *buf;
 
-	CAMEL_SERVICE_CLASS (parent_class)->construct (service, session, provider, url, ex);
+	CAMEL_SERVICE_CLASS (camel_imap4_store_parent_class)->construct (service, session, provider, url, ex);
 	if (camel_exception_is_set (ex))
 		return;
 
diff --git a/camel/providers/imap4/camel-imap4-stream.c b/camel/providers/imap4/camel-imap4-stream.c
index 713ec7e..02600de 100644
--- a/camel/providers/imap4/camel-imap4-stream.c
+++ b/camel/providers/imap4/camel-imap4-stream.c
@@ -46,8 +46,6 @@ static gint stream_flush  (CamelStream *stream);
 static gint stream_close  (CamelStream *stream);
 static gboolean stream_eos (CamelStream *stream);
 
-static gpointer parent_class;
-
 GType
 camel_imap4_stream_get_type (void)
 {
@@ -72,8 +70,6 @@ camel_imap4_stream_class_init (CamelIMAP4StreamClass *class)
 {
 	CamelStreamClass *stream_class = (CamelStreamClass *) class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	stream_class->read = stream_read;
 	stream_class->write = stream_write;
 	stream_class->flush = stream_flush;
diff --git a/camel/providers/imap4/camel-imap4-summary.c b/camel/providers/imap4/camel-imap4-summary.c
index 51e6e45..d113b43 100644
--- a/camel/providers/imap4/camel-imap4-summary.c
+++ b/camel/providers/imap4/camel-imap4-summary.c
@@ -66,8 +66,6 @@ static CamelMessageInfo *imap4_message_info_clone (CamelFolderSummary *summary,
 static CamelMessageContentInfo *imap4_content_info_load (CamelFolderSummary *summary, FILE *in);
 static gint imap4_content_info_save (CamelFolderSummary *summary, FILE *out, CamelMessageContentInfo *info);
 
-static gpointer parent_class;
-
 GType
 camel_imap4_summary_get_type (void)
 {
@@ -92,8 +90,6 @@ camel_imap4_summary_class_init (CamelIMAP4SummaryClass *class)
 {
 	CamelFolderSummaryClass *summary_class = (CamelFolderSummaryClass *) class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	summary_class->summary_header_load = imap4_header_load;
 	summary_class->summary_header_save = imap4_header_save;
 	summary_class->message_info_new_from_header = imap4_message_info_new_from_header;
@@ -140,7 +136,7 @@ imap4_header_load (CamelFolderSummary *summary, FILE *fin)
 {
 	CamelIMAP4Summary *imap4_summary = (CamelIMAP4Summary *) summary;
 
-	if (CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->summary_header_load (summary, fin) == -1)
+	if (CAMEL_FOLDER_SUMMARY_CLASS (camel_imap4_summary_parent_class)->summary_header_load (summary, fin) == -1)
 		return -1;
 
 	if (camel_file_util_decode_fixed_int32 (fin, &imap4_summary->version) == -1)
@@ -176,7 +172,7 @@ imap4_header_save (CamelFolderSummary *summary, FILE *fout)
 {
 	CamelIMAP4Summary *imap4_summary = (CamelIMAP4Summary *) summary;
 
-	if (CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->summary_header_save (summary, fout) == -1)
+	if (CAMEL_FOLDER_SUMMARY_CLASS (camel_imap4_summary_parent_class)->summary_header_save (summary, fout) == -1)
 		return -1;
 
 	if (camel_file_util_encode_fixed_int32 (fout, CAMEL_IMAP4_SUMMARY_VERSION) == -1)
@@ -1336,7 +1332,7 @@ imap4_message_info_new_from_header (CamelFolderSummary *summary, struct _camel_h
 {
 	CamelMessageInfo *info;
 
-	info = CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->message_info_new_from_header (summary, header);
+	info = CAMEL_FOLDER_SUMMARY_CLASS (camel_imap4_summary_parent_class)->message_info_new_from_header (summary, header);
 	((CamelIMAP4MessageInfo *) info)->server_flags = 0;
 
 	return info;
@@ -1348,7 +1344,7 @@ imap4_message_info_load (CamelFolderSummary *summary, FILE *fin)
 	CamelIMAP4MessageInfo *minfo;
 	CamelMessageInfo *info;
 
-	if (!(info = CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->message_info_load (summary, fin)))
+	if (!(info = CAMEL_FOLDER_SUMMARY_CLASS (camel_imap4_summary_parent_class)->message_info_load (summary, fin)))
 		return NULL;
 
 	minfo = (CamelIMAP4MessageInfo *) info;
@@ -1370,7 +1366,7 @@ imap4_message_info_save (CamelFolderSummary *summary, FILE *fout, CamelMessageIn
 {
 	CamelIMAP4MessageInfo *minfo = (CamelIMAP4MessageInfo *) info;
 
-	if (CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->message_info_save (summary, fout, info) == -1)
+	if (CAMEL_FOLDER_SUMMARY_CLASS (camel_imap4_summary_parent_class)->message_info_save (summary, fout, info) == -1)
 		return -1;
 
 	if (camel_file_util_encode_uint32 (fout, minfo->server_flags) == -1)
@@ -1385,7 +1381,7 @@ imap4_message_info_clone (CamelFolderSummary *summary, const CamelMessageInfo *m
 	const CamelIMAP4MessageInfo *src = (const CamelIMAP4MessageInfo *) mi;
 	CamelIMAP4MessageInfo *dest;
 
-	dest = (CamelIMAP4MessageInfo *) CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->message_info_clone (summary, mi);
+	dest = (CamelIMAP4MessageInfo *) CAMEL_FOLDER_SUMMARY_CLASS (camel_imap4_summary_parent_class)->message_info_clone (summary, mi);
 	dest->server_flags = src->server_flags;
 
 	/* FIXME: parent clone should do this */
@@ -1398,7 +1394,7 @@ static CamelMessageContentInfo *
 imap4_content_info_load (CamelFolderSummary *summary, FILE *in)
 {
 	if (fgetc (in))
-		return CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->content_info_load (summary, in);
+		return CAMEL_FOLDER_SUMMARY_CLASS (camel_imap4_summary_parent_class)->content_info_load (summary, in);
 	else
 		return camel_folder_summary_content_info_new (summary);
 }
@@ -1408,7 +1404,7 @@ imap4_content_info_save (CamelFolderSummary *summary, FILE *out, CamelMessageCon
 {
 	if (info->type) {
 		fputc (1, out);
-		return CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->content_info_save (summary, out, info);
+		return CAMEL_FOLDER_SUMMARY_CLASS (camel_imap4_summary_parent_class)->content_info_save (summary, out, info);
 	} else
 		return fputc (0, out);
 }
diff --git a/camel/providers/imapx/camel-imapx-stream.c b/camel/providers/imapx/camel-imapx-stream.c
index dbc8c1b..2a796a0 100644
--- a/camel/providers/imapx/camel-imapx-stream.c
+++ b/camel/providers/imapx/camel-imapx-stream.c
@@ -40,8 +40,6 @@
 #define t(x) 
 #define io(x)
 
-static CamelObjectClass *parent_class = NULL;
-
 /* Returns the class for a CamelStream */
 #define CS_CLASS(so) CAMEL_IMAPX_STREAM_CLASS(CAMEL_OBJECT_GET_CLASS(so))
 
@@ -147,8 +145,6 @@ camel_imapx_stream_class_init (CamelStreamClass *camel_imapx_stream_class)
 {
 	CamelStreamClass *camel_stream_class = (CamelStreamClass *)camel_imapx_stream_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	camel_stream_class->read = stream_read;
 	camel_stream_class->write = stream_write;
 	camel_stream_class->close = stream_close;
diff --git a/camel/providers/local/camel-local-folder.c b/camel/providers/local/camel-local-folder.c
index 54b10c5..3cae514 100644
--- a/camel/providers/local/camel-local-folder.c
+++ b/camel/providers/local/camel-local-folder.c
@@ -57,7 +57,6 @@
 	(G_TYPE_INSTANCE_GET_PRIVATE \
 	((obj), CAMEL_TYPE_LOCAL_FOLDER, CamelLocalFolderPrivate))
 
-static gpointer parent_class;
 static GSList *local_folder_properties;
 
 static gint local_getv(CamelObject *object, GError **error, CamelArgGetV *args);
@@ -84,6 +83,8 @@ static CamelProperty local_property_list[] = {
 	{ CAMEL_LOCAL_FOLDER_INDEX_BODY, "index_body", N_("Index message body data") },
 };
 
+G_DEFINE_TYPE (CamelLocalFolder, camel_local_folder, CAMEL_TYPE_FOLDER)
+
 static void
 local_folder_dispose (GObject *object)
 {
@@ -112,7 +113,7 @@ local_folder_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_local_folder_parent_class)->dispose (object);
 }
 
 static void
@@ -135,18 +136,17 @@ local_folder_finalize (GObject *object)
 	g_mutex_free (local_folder->priv->search_lock);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_local_folder_parent_class)->finalize (object);
 }
 
 static void
-local_folder_class_init (CamelLocalFolderClass *class)
+camel_local_folder_class_init (CamelLocalFolderClass *class)
 {
 	GObjectClass *object_class;
 	CamelObjectClass *camel_object_class;
 	CamelFolderClass *folder_class;
 	gint ii;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelLocalFolderPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -181,7 +181,7 @@ local_folder_class_init (CamelLocalFolderClass *class)
 }
 
 static void
-local_folder_init (CamelLocalFolder *local_folder)
+camel_local_folder_init (CamelLocalFolder *local_folder)
 {
 	CamelFolder *folder = CAMEL_FOLDER (local_folder);
 
@@ -200,24 +200,6 @@ local_folder_init (CamelLocalFolder *local_folder)
 	local_folder->search = NULL;
 }
 
-GType
-camel_local_folder_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_FOLDER,
-			"CamelLocalFolder",
-			sizeof (CamelLocalFolderClass),
-			(GClassInitFunc) local_folder_class_init,
-			sizeof (CamelLocalFolder),
-			(GInstanceInitFunc) local_folder_init,
-			0);
-
-	return type;
-}
-
 CamelLocalFolder *
 camel_local_folder_construct(CamelLocalFolder *lf, CamelStore *parent_store, const gchar *full_name, guint32 flags, GError **error)
 {
@@ -429,7 +411,7 @@ local_getv(CamelObject *object, GError **error, CamelArgGetV *args)
 
 			props.argc = 1;
 			props.argv[0] = *arg;
-			((CamelObjectClass *)parent_class)->getv(object, error, &props);
+			((CamelObjectClass *)camel_local_folder_parent_class)->getv(object, error, &props);
 			*arg->ca_ptr = g_slist_concat(*arg->ca_ptr, g_slist_copy(local_folder_properties));
 
 			break; }
@@ -446,7 +428,7 @@ local_getv(CamelObject *object, GError **error, CamelArgGetV *args)
 		arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE;
 	}
 
-	return ((CamelObjectClass *)parent_class)->getv(object, error, args);
+	return ((CamelObjectClass *)camel_local_folder_parent_class)->getv(object, error, args);
 }
 
 static gint
@@ -477,7 +459,7 @@ local_setv(CamelObject *object, GError **error, CamelArgV *args)
 		arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE;
 	}
 
-	return ((CamelObjectClass *)parent_class)->setv(object, error, args);
+	return ((CamelObjectClass *)camel_local_folder_parent_class)->setv(object, error, args);
 }
 
 static gint
@@ -562,7 +544,7 @@ local_delete(CamelFolder *folder)
 	if (lf->index)
 		camel_index_delete(lf->index);
 
-	CAMEL_FOLDER_CLASS (parent_class)->delete (folder);
+	CAMEL_FOLDER_CLASS (camel_local_folder_parent_class)->delete (folder);
 }
 
 static void
@@ -592,7 +574,7 @@ local_rename(CamelFolder *folder, const gchar *newname)
 	g_free(((CamelLocalSummary *)folder->summary)->folder_path);
 	((CamelLocalSummary *)folder->summary)->folder_path = g_strdup(lf->folder_path);
 
-	CAMEL_FOLDER_CLASS (parent_class)->rename (folder, newname);
+	CAMEL_FOLDER_CLASS (camel_local_folder_parent_class)->rename (folder, newname);
 }
 
 static GPtrArray *
diff --git a/camel/providers/local/camel-local-store.c b/camel/providers/local/camel-local-store.c
index 1f44efd..72bb522 100644
--- a/camel/providers/local/camel-local-store.c
+++ b/camel/providers/local/camel-local-store.c
@@ -54,7 +54,7 @@ static gboolean local_can_refresh_folder (CamelStore *store, CamelFolderInfo *in
 static gchar *local_get_full_path(CamelLocalStore *lf, const gchar *full_name);
 static gchar *local_get_meta_path(CamelLocalStore *lf, const gchar *full_name, const gchar *ext);
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelLocalStore, camel_local_store, CAMEL_TYPE_STORE)
 
 static void
 local_store_finalize (GObject *object)
@@ -64,18 +64,16 @@ local_store_finalize (GObject *object)
 	g_free (local_store->toplevel_dir);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_local_store_parent_class)->finalize (object);
 }
 
 static void
-local_store_class_init (CamelLocalStoreClass *class)
+camel_local_store_class_init (CamelLocalStoreClass *class)
 {
 	GObjectClass *object_class;
 	CamelServiceClass *service_class;
 	CamelStoreClass *store_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->finalize = local_store_finalize;
 
@@ -99,22 +97,9 @@ local_store_class_init (CamelLocalStoreClass *class)
 	class->get_meta_path = local_get_meta_path;
 }
 
-GType
-camel_local_store_get_type (void)
+static void
+camel_local_store_init (CamelLocalStore *local_store)
 {
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_STORE,
-			"CamelLocalStore",
-			sizeof (CamelLocalStoreClass),
-			(GClassInitFunc) local_store_class_init,
-			sizeof (CamelLocalStore),
-			(GInstanceInitFunc) NULL,
-			0);
-
-	return type;
 }
 
 static gboolean
@@ -129,7 +114,7 @@ construct (CamelService *service,
 	gint len;
 
 	/* Chain up to parent's construct() method. */
-	service_class = CAMEL_SERVICE_CLASS (parent_class);
+	service_class = CAMEL_SERVICE_CLASS (camel_local_store_parent_class);
 	if (!service_class->construct (service, session, provider, url, error))
 		return FALSE;
 
@@ -219,7 +204,7 @@ local_get_trash (CamelStore *store,
 	CamelFolder *folder;
 
 	/* Chain up to parent's get_trash() method. */
-	folder = CAMEL_STORE_CLASS (parent_class)->get_trash (store, error);
+	folder = CAMEL_STORE_CLASS (camel_local_store_parent_class)->get_trash (store, error);
 
 	if (folder) {
 		gchar *state = camel_local_store_get_meta_path(store, CAMEL_VTRASH_NAME, ".cmeta");
@@ -240,7 +225,7 @@ local_get_junk (CamelStore *store,
 	CamelFolder *folder;
 
 	/* Chain up to parent's get_junk() method. */
-	folder = CAMEL_STORE_CLASS (parent_class)->get_junk (store, error);
+	folder = CAMEL_STORE_CLASS (camel_local_store_parent_class)->get_junk (store, error);
 
 	if (folder) {
 		gchar *state = camel_local_store_get_meta_path(store, CAMEL_VJUNK_NAME, ".cmeta");
diff --git a/camel/providers/local/camel-local-summary.c b/camel/providers/local/camel-local-summary.c
index 88ae044..c48577b 100644
--- a/camel/providers/local/camel-local-summary.c
+++ b/camel/providers/local/camel-local-summary.c
@@ -60,7 +60,7 @@ static gint local_summary_sync(CamelLocalSummary *cls, gboolean expunge, CamelFo
 static CamelMessageInfo *local_summary_add(CamelLocalSummary *cls, CamelMimeMessage *msg, const CamelMessageInfo *info, CamelFolderChangeInfo *, GError **error);
 static gint local_summary_need_index(void);
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelLocalSummary, camel_local_summary, CAMEL_TYPE_FOLDER_SUMMARY)
 
 static void
 local_summary_dispose (GObject *object)
@@ -75,7 +75,7 @@ local_summary_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_local_summary_parent_class)->dispose (object);
 }
 
 static void
@@ -88,17 +88,15 @@ local_summary_finalize (GObject *object)
 	g_free (local_summary->folder_path);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_local_summary_parent_class)->finalize (object);
 }
 
 static void
-local_summary_class_init (CamelLocalSummaryClass *class)
+camel_local_summary_class_init (CamelLocalSummaryClass *class)
 {
 	GObjectClass *object_class;
 	CamelFolderSummaryClass *folder_summary_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->dispose = local_summary_dispose;
 	object_class->finalize = local_summary_finalize;
@@ -122,7 +120,7 @@ local_summary_class_init (CamelLocalSummaryClass *class)
 }
 
 static void
-local_summary_init (CamelLocalSummary *local_summary)
+camel_local_summary_init (CamelLocalSummary *local_summary)
 {
 	CamelFolderSummary *folder_summary;
 
@@ -132,24 +130,6 @@ local_summary_init (CamelLocalSummary *local_summary)
 	folder_summary->version += CAMEL_LOCAL_SUMMARY_VERSION;
 }
 
-GType
-camel_local_summary_get_type(void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_FOLDER_SUMMARY,
-			"CamelLocalSummary",
-			sizeof (CamelLocalSummaryClass),
-			(GClassInitFunc) local_summary_class_init,
-			sizeof (CamelLocalSummary),
-			(GInstanceInitFunc) local_summary_init,
-			0);
-
-	return type;
-}
-
 void
 camel_local_summary_construct(CamelLocalSummary *new, const gchar *filename, const gchar *local_name, CamelIndex *index)
 {
@@ -700,7 +680,7 @@ summary_header_from_db (CamelFolderSummary *s, CamelFIRecord *fir)
 
 	/* We dont actually add our own headers, but version that we don't anyway */
 
-	if (CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->summary_header_from_db(s, fir) == -1)
+	if (CAMEL_FOLDER_SUMMARY_CLASS (camel_local_summary_parent_class)->summary_header_from_db(s, fir) == -1)
 		return -1;
 
 	part = fir->bdata;
@@ -723,7 +703,7 @@ summary_header_load(CamelFolderSummary *s, FILE *in)
 
 	/* We dont actually add our own headers, but version that we don't anyway */
 
-	if (CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->summary_header_load(s, in) == -1)
+	if (CAMEL_FOLDER_SUMMARY_CLASS (camel_local_summary_parent_class)->summary_header_load(s, in) == -1)
 		return -1;
 
 	/* Legacy version, version is in summary only */
@@ -741,7 +721,7 @@ summary_header_to_db (CamelFolderSummary *s, GError **error)
 	struct _CamelFIRecord *fir;
 
 	/* Chain up to parent's summary_header_to_db() method. */
-	folder_summary_class = CAMEL_FOLDER_SUMMARY_CLASS (parent_class);
+	folder_summary_class = CAMEL_FOLDER_SUMMARY_CLASS (camel_local_summary_parent_class);
 	fir = folder_summary_class->summary_header_to_db (s, error);
 
 	if (fir)
@@ -755,7 +735,7 @@ summary_header_save(CamelFolderSummary *s, FILE *out)
 {
 	/*CamelLocalSummary *cls = (CamelLocalSummary *)s;*/
 
-	if (CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->summary_header_save(s, out) == -1)
+	if (CAMEL_FOLDER_SUMMARY_CLASS (camel_local_summary_parent_class)->summary_header_save(s, out) == -1)
 		return -1;
 
 	return camel_file_util_encode_fixed_int32(out, CAMEL_LOCAL_SUMMARY_VERSION);
@@ -767,7 +747,7 @@ message_info_new_from_header(CamelFolderSummary *s, GQueue *header_queue)
 	CamelLocalMessageInfo *mi;
 	CamelLocalSummary *cls = (CamelLocalSummary *)s;
 
-	mi = (CamelLocalMessageInfo *)CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->message_info_new_from_header(s, header_queue);
+	mi = (CamelLocalMessageInfo *)CAMEL_FOLDER_SUMMARY_CLASS (camel_local_summary_parent_class)->message_info_new_from_header(s, header_queue);
 	if (mi) {
 		const gchar *xev;
 		gint doindex = FALSE;
diff --git a/camel/providers/local/camel-maildir-folder.c b/camel/providers/local/camel-maildir-folder.c
index f7f8b45..9ba5062 100644
--- a/camel/providers/local/camel-maildir-folder.c
+++ b/camel/providers/local/camel-maildir-folder.c
@@ -41,8 +41,6 @@
 
 #define d(x) /*(printf("%s(%d): ", __FILE__, __LINE__),(x))*/
 
-static gpointer parent_class;
-
 static CamelLocalSummary *maildir_create_summary(CamelLocalFolder *lf, const gchar *path, const gchar *folder, CamelIndex *index);
 
 static gboolean maildir_append_message(CamelFolder * folder, CamelMimeMessage * message, const CamelMessageInfo *info, gchar **appended_uid, GError **error);
@@ -52,6 +50,8 @@ static gint maildir_cmp_uids (CamelFolder *folder, const gchar *uid1, const gcha
 static void maildir_sort_uids (CamelFolder *folder, GPtrArray *uids);
 static gboolean maildir_transfer_messages_to (CamelFolder *source, GPtrArray *uids, CamelFolder *dest, GPtrArray **transferred_uids, gboolean delete_originals, GError **error);
 
+G_DEFINE_TYPE (CamelMaildirFolder, camel_maildir_folder, CAMEL_TYPE_LOCAL_FOLDER)
+
 static gint
 maildir_folder_getv (CamelObject *object,
                      GError **error,
@@ -80,18 +80,16 @@ maildir_folder_getv (CamelObject *object,
 		arg->tag = (tag & CAMEL_ARG_TYPE) | CAMEL_ARG_IGNORE;
 	}
 
-	return ((CamelObjectClass *)parent_class)->getv(object, error, args);
+	return ((CamelObjectClass *)camel_maildir_folder_parent_class)->getv(object, error, args);
 }
 
 static void
-maildir_folder_class_init (CamelObjectClass *class)
+camel_maildir_folder_class_init (CamelMaildirFolderClass *class)
 {
 	CamelObjectClass *camel_object_class;
 	CamelFolderClass *folder_class;
 	CamelLocalFolderClass *local_folder_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	camel_object_class = CAMEL_OBJECT_CLASS (class);
 	camel_object_class->getv = maildir_folder_getv;
 
@@ -107,22 +105,9 @@ maildir_folder_class_init (CamelObjectClass *class)
 	local_folder_class->create_summary = maildir_create_summary;
 }
 
-GType
-camel_maildir_folder_get_type (void)
+static void
+camel_maildir_folder_init (CamelMaildirFolder *maildir_folder)
 {
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_LOCAL_FOLDER,
-			"CamelMaildirFolder",
-			sizeof (CamelMaildirFolderClass),
-			(GClassInitFunc) maildir_folder_class_init,
-			sizeof (CamelMaildirFolder),
-			(GInstanceInitFunc) NULL,
-			0);
-
-	return type;
 }
 
 CamelFolder *
@@ -374,7 +359,7 @@ static void
 maildir_sort_uids (CamelFolder *folder,
                    GPtrArray *uids)
 {
-	g_return_if_fail (parent_class != NULL);
+	g_return_if_fail (camel_maildir_folder_parent_class != NULL);
 	g_return_if_fail (folder != NULL);
 
 	if (uids && uids->len > 1)
@@ -382,7 +367,7 @@ maildir_sort_uids (CamelFolder *folder,
 			folder->summary, uids->len, NULL);
 
 	/* Chain up to parent's sort_uids() method. */
-	CAMEL_FOLDER_CLASS (parent_class)->sort_uids (folder, uids);
+	CAMEL_FOLDER_CLASS (camel_maildir_folder_parent_class)->sort_uids (folder, uids);
 }
 
 static gboolean
@@ -459,7 +444,7 @@ maildir_transfer_messages_to (CamelFolder *source,
 		CamelFolderClass *folder_class;
 
 		/* Chain up to parent's transfer_messages_to() method. */
-		folder_class = CAMEL_FOLDER_CLASS (parent_class);
+		folder_class = CAMEL_FOLDER_CLASS (camel_maildir_folder_parent_class);
 		return folder_class->transfer_messages_to (
 			source, uids, dest, transferred_uids,
 			delete_originals, error);
diff --git a/camel/providers/local/camel-maildir-store.c b/camel/providers/local/camel-maildir-store.c
index e498539..d58f795 100644
--- a/camel/providers/local/camel-maildir-store.c
+++ b/camel/providers/local/camel-maildir-store.c
@@ -38,8 +38,6 @@
 
 #define d(x)
 
-static gpointer parent_class;
-
 static CamelFolder *get_folder(CamelStore * store, const gchar *folder_name, guint32 flags, GError **error);
 static CamelFolder *get_inbox (CamelStore *store, GError **error);
 static gboolean delete_folder(CamelStore * store, const gchar *folder_name, GError **error);
@@ -50,13 +48,13 @@ static CamelFolderInfo * get_folder_info (CamelStore *store, const gchar *top, g
 static gboolean maildir_compare_folder_name(gconstpointer a, gconstpointer b);
 static guint maildir_hash_folder_name(gconstpointer a);
 
+G_DEFINE_TYPE (CamelMaildirStore, camel_maildir_store, CAMEL_TYPE_LOCAL_STORE)
+
 static void
-maildir_store_class_init (CamelObjectClass *class)
+camel_maildir_store_class_init (CamelMaildirStoreClass *class)
 {
 	CamelStoreClass *store_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	store_class = CAMEL_STORE_CLASS (class);
 	store_class->hash_folder_name = maildir_hash_folder_name;
 	store_class->compare_folder_name = maildir_compare_folder_name;
@@ -68,22 +66,9 @@ maildir_store_class_init (CamelObjectClass *class)
 	store_class->free_folder_info = camel_store_free_folder_info_full;
 }
 
-GType
-camel_maildir_store_get_type (void)
+static void
+camel_maildir_store_init (CamelMaildirStore *maildir_store)
 {
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_LOCAL_STORE,
-			"CamelMaildirStore",
-			sizeof (CamelMaildirStoreClass),
-			(GClassInitFunc) maildir_store_class_init,
-			sizeof (CamelMaildirStore),
-			(GInstanceInitFunc) NULL,
-			0);
-
-	return type;
 }
 
 /* This fixes up some historical cruft of names starting with "./" */
@@ -127,7 +112,7 @@ get_folder (CamelStore * store,
 	folder_name = md_canon_name(folder_name);
 
 	/* Chain up to parent's get_folder() method. */
-	store_class = CAMEL_STORE_CLASS (parent_class);
+	store_class = CAMEL_STORE_CLASS (camel_maildir_store_parent_class);
 	if (!store_class->get_folder (store, folder_name, flags, error))
 		return NULL;
 
@@ -301,7 +286,7 @@ delete_folder (CamelStore * store,
 			CamelStoreClass *store_class;
 
 			/* Chain up to parent's delete_folder() method. */
-			store_class = CAMEL_STORE_CLASS (parent_class);
+			store_class = CAMEL_STORE_CLASS (camel_maildir_store_parent_class);
 			success = store_class->delete_folder (
 				store, folder_name, error);
 		}
@@ -333,7 +318,7 @@ maildir_rename_folder (CamelStore *store,
 	}
 
 	/* Chain up to parent's rename_folder() method. */
-	store_class = CAMEL_STORE_CLASS (parent_class);
+	store_class = CAMEL_STORE_CLASS (camel_maildir_store_parent_class);
 	return store_class->rename_folder (store, old, new, error);
 }
 
diff --git a/camel/providers/local/camel-maildir-summary.c b/camel/providers/local/camel-maildir-summary.c
index 4e47439..f6d7074 100644
--- a/camel/providers/local/camel-maildir-summary.c
+++ b/camel/providers/local/camel-maildir-summary.c
@@ -69,7 +69,7 @@ struct _CamelMaildirSummaryPrivate {
 	GMutex *summary_lock;
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelMaildirSummary, camel_maildir_summary, CAMEL_TYPE_LOCAL_SUMMARY)
 
 static void
 maildir_summary_finalize (GObject *object)
@@ -82,17 +82,16 @@ maildir_summary_finalize (GObject *object)
 	g_mutex_free (priv->summary_lock);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_maildir_summary_parent_class)->finalize (object);
 }
 
 static void
-maildir_summary_class_init (CamelMaildirSummaryClass *class)
+camel_maildir_summary_class_init (CamelMaildirSummaryClass *class)
 {
 	GObjectClass *object_class;
 	CamelFolderSummaryClass *folder_summary_class;
 	CamelLocalSummaryClass *local_summary_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelMaildirSummaryPrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -116,7 +115,7 @@ maildir_summary_class_init (CamelMaildirSummaryClass *class)
 }
 
 static void
-maildir_summary_init (CamelMaildirSummary *maildir_summary)
+camel_maildir_summary_init (CamelMaildirSummary *maildir_summary)
 {
 	CamelFolderSummary *folder_summary;
 	gchar hostname[256];
@@ -137,24 +136,6 @@ maildir_summary_init (CamelMaildirSummary *maildir_summary)
 	maildir_summary->priv->summary_lock = g_mutex_new ();
 }
 
-GType
-camel_maildir_summary_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_LOCAL_SUMMARY,
-			"CamelMaildirSummary",
-			sizeof (CamelMaildirSummaryClass),
-			(GClassInitFunc) maildir_summary_class_init,
-			sizeof (CamelMaildirSummary),
-			(GInstanceInitFunc) maildir_summary_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_maildir_summary_new:
  * @folder: parent folder.
@@ -274,7 +255,7 @@ maildir_summary_add (CamelLocalSummary *cls,
 	CamelMaildirMessageInfo *mi;
 
 	/* Chain up to parent's add() method. */
-	local_summary_class = CAMEL_LOCAL_SUMMARY_CLASS (parent_class);
+	local_summary_class = CAMEL_LOCAL_SUMMARY_CLASS (camel_maildir_summary_parent_class);
 	mi = (CamelMaildirMessageInfo *) local_summary_class->add (
 		cls, msg, info, changes, error);
 	if (mi) {
@@ -295,7 +276,7 @@ message_info_new_from_header(CamelFolderSummary * s, GQueue *header_queue)
 	CamelMaildirMessageInfo *mdi;
 	const gchar *uid;
 
-	mi = ((CamelFolderSummaryClass *) parent_class)->message_info_new_from_header(s, header_queue);
+	mi = ((CamelFolderSummaryClass *) camel_maildir_summary_parent_class)->message_info_new_from_header(s, header_queue);
 	/* assign the uid and new filename */
 	if (mi) {
 		mdi = (CamelMaildirMessageInfo *)mi;
@@ -357,7 +338,7 @@ message_info_free(CamelFolderSummary *s, CamelMessageInfo *mi)
 
 	g_free(mdi->filename);
 
-	((CamelFolderSummaryClass *) parent_class)->message_info_free(s, mi);
+	((CamelFolderSummaryClass *) camel_maildir_summary_parent_class)->message_info_free(s, mi);
 }
 
 static gchar *maildir_summary_next_uid_string(CamelFolderSummary *s)
@@ -412,7 +393,7 @@ message_info_load(CamelFolderSummary *s, FILE *in)
 	CamelMessageInfo *mi;
 	CamelMaildirSummary *mds = (CamelMaildirSummary *)s;
 
-	mi = ((CamelFolderSummaryClass *) parent_class)->message_info_load(s, in);
+	mi = ((CamelFolderSummaryClass *) camel_maildir_summary_parent_class)->message_info_load(s, in);
 	if (mi) {
 		gchar *name;
 
@@ -480,7 +461,7 @@ maildir_summary_load (CamelLocalSummary *cls,
 	g_free(cur);
 
 	/* Chain up to parent's load() method. */
-	local_summary_class = CAMEL_LOCAL_SUMMARY_CLASS (parent_class);
+	local_summary_class = CAMEL_LOCAL_SUMMARY_CLASS (camel_maildir_summary_parent_class);
 	ret = local_summary_class->load (cls, forceindex, error);
 
 	g_hash_table_destroy(mds->priv->load_map);
@@ -808,7 +789,7 @@ maildir_summary_sync (CamelLocalSummary *cls,
 	camel_operation_end(NULL);
 
 	/* Chain up to parent's sync() method. */
-	local_summary_class = CAMEL_LOCAL_SUMMARY_CLASS (parent_class);
+	local_summary_class = CAMEL_LOCAL_SUMMARY_CLASS (camel_maildir_summary_parent_class);
 	return local_summary_class->sync (cls, expunge, changes, error);
 }
 
diff --git a/camel/providers/local/camel-mbox-folder.c b/camel/providers/local/camel-mbox-folder.c
index d1723cb..c08f7c3 100644
--- a/camel/providers/local/camel-mbox-folder.c
+++ b/camel/providers/local/camel-mbox-folder.c
@@ -46,8 +46,6 @@
 
 #define d(x) /*(printf("%s(%d): ", __FILE__, __LINE__),(x))*/
 
-static gpointer parent_class;
-
 static gint mbox_lock(CamelLocalFolder *lf, CamelLockType type, GError **error);
 static void mbox_unlock(CamelLocalFolder *lf);
 
@@ -58,14 +56,14 @@ static gchar * mbox_get_filename (CamelFolder *folder, const gchar *uid, GError
 static gint mbox_cmp_uids (CamelFolder *folder, const gchar *uid1, const gchar *uid2);
 static void mbox_sort_uids (CamelFolder *folder, GPtrArray *uids);
 
+G_DEFINE_TYPE (CamelMboxFolder, camel_mbox_folder, CAMEL_TYPE_LOCAL_FOLDER)
+
 static void
-mbox_folder_class_init (CamelMboxFolderClass *class)
+camel_mbox_folder_class_init (CamelMboxFolderClass *class)
 {
 	CamelFolderClass *folder_class;
 	CamelLocalFolderClass *local_folder_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	folder_class = CAMEL_FOLDER_CLASS (class);
 	folder_class->append_message = mbox_append_message;
 	folder_class->get_message = mbox_get_message;
@@ -80,29 +78,11 @@ mbox_folder_class_init (CamelMboxFolderClass *class)
 }
 
 static void
-mbox_folder_init (CamelMboxFolder *mbox_folder)
+camel_mbox_folder_init (CamelMboxFolder *mbox_folder)
 {
 	mbox_folder->lockfd = -1;
 }
 
-GType
-camel_mbox_folder_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_LOCAL_FOLDER,
-			"CamelMboxFolder",
-			sizeof (CamelMboxFolderClass),
-			(GClassInitFunc) mbox_folder_class_init,
-			sizeof (CamelMboxFolder),
-			(GInstanceInitFunc) mbox_folder_init,
-			0);
-
-	return type;
-}
-
 CamelFolder *
 camel_mbox_folder_new(CamelStore *parent_store, const gchar *full_name, guint32 flags, GError **error)
 {
@@ -505,12 +485,12 @@ mbox_cmp_uids (CamelFolder *folder, const gchar *uid1, const gchar *uid2)
 static void
 mbox_sort_uids (CamelFolder *folder, GPtrArray *uids)
 {
-	g_return_if_fail (parent_class != NULL);
+	g_return_if_fail (camel_mbox_folder_parent_class != NULL);
 	g_return_if_fail (folder != NULL);
 
 	if (uids && uids->len > 1)
 		camel_folder_summary_ensure_infos_loaded (
 			folder->summary, uids->len, NULL);
 
-	CAMEL_FOLDER_CLASS (parent_class)->sort_uids (folder, uids);
+	CAMEL_FOLDER_CLASS (camel_mbox_folder_parent_class)->sort_uids (folder, uids);
 }
diff --git a/camel/providers/local/camel-mbox-store.c b/camel/providers/local/camel-mbox-store.c
index af7b199..70c12c9 100644
--- a/camel/providers/local/camel-mbox-store.c
+++ b/camel/providers/local/camel-mbox-store.c
@@ -40,8 +40,6 @@
 
 #define d(x)
 
-static gpointer parent_class;
-
 static CamelFolder *get_folder(CamelStore *store, const gchar *folder_name, guint32 flags, GError **error);
 static gboolean delete_folder(CamelStore *store, const gchar *folder_name, GError **error);
 static gboolean rename_folder(CamelStore *store, const gchar *old, const gchar *new, GError **error);
@@ -50,14 +48,14 @@ static CamelFolderInfo *get_folder_info(CamelStore *store, const gchar *top, gui
 static gchar *mbox_get_meta_path(CamelLocalStore *ls, const gchar *full_name, const gchar *ext);
 static gchar *mbox_get_full_path(CamelLocalStore *ls, const gchar *full_name);
 
+G_DEFINE_TYPE (CamelMboxStore, camel_mbox_store, CAMEL_TYPE_LOCAL_STORE)
+
 static void
-mbox_store_class_init (CamelMboxStoreClass *class)
+camel_mbox_store_class_init (CamelMboxStoreClass *class)
 {
 	CamelStoreClass *store_class;
 	CamelLocalStoreClass *local_store_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	store_class = CAMEL_STORE_CLASS (class);
 	store_class->get_folder = get_folder;
 	store_class->delete_folder = delete_folder;
@@ -71,22 +69,9 @@ mbox_store_class_init (CamelMboxStoreClass *class)
 	local_store_class->get_meta_path = mbox_get_meta_path;
 }
 
-GType
-camel_mbox_store_get_type (void)
+static void
+camel_mbox_store_init (CamelMboxStore *mbox_store)
 {
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_LOCAL_STORE,
-			"CamelMboxStore",
-			sizeof (CamelMboxStoreClass),
-			(GClassInitFunc) mbox_store_class_init,
-			sizeof (CamelMboxStore),
-			(GInstanceInitFunc) NULL,
-			0);
-
-	return type;
 }
 
 static const gchar *extensions[] = {
@@ -126,7 +111,7 @@ get_folder (CamelStore *store,
 	gchar *name;
 
 	/* Chain up to parent's get_folder() method. */
-	store_class = CAMEL_STORE_CLASS (parent_class);
+	store_class = CAMEL_STORE_CLASS (camel_mbox_store_parent_class);
 	if (!store_class->get_folder (store, folder_name, flags, error))
 		return NULL;
 
diff --git a/camel/providers/local/camel-mbox-summary.c b/camel/providers/local/camel-mbox-summary.c
index 6919a7c..6f8dab2 100644
--- a/camel/providers/local/camel-mbox-summary.c
+++ b/camel/providers/local/camel-mbox-summary.c
@@ -81,14 +81,14 @@ static void encode_status(guint32 flags, gchar status[8]);
 static guint32 decode_status(const gchar *status);
 #endif
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelMboxSummary, camel_mbox_summary, CAMEL_TYPE_LOCAL_SUMMARY)
 
 static gboolean
 mbox_info_set_user_flag(CamelMessageInfo *mi, const gchar *name, gboolean value)
 {
 	gint res;
 
-	res = CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->info_set_user_flag(mi, name, value);
+	res = CAMEL_FOLDER_SUMMARY_CLASS (camel_mbox_summary_parent_class)->info_set_user_flag(mi, name, value);
 	if (res)
 		((CamelLocalMessageInfo *)mi)->info.flags |= CAMEL_MESSAGE_FOLDER_FLAGGED;
 
@@ -100,7 +100,7 @@ mbox_info_set_user_tag(CamelMessageInfo *mi, const gchar *name, const gchar *val
 {
 	gint res;
 
-	res = CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->info_set_user_tag(mi, name, value);
+	res = CAMEL_FOLDER_SUMMARY_CLASS (camel_mbox_summary_parent_class)->info_set_user_tag(mi, name, value);
 	if (res)
 		((CamelLocalMessageInfo *)mi)->info.flags |= CAMEL_MESSAGE_FOLDER_FLAGGED;
 
@@ -118,18 +118,16 @@ mbox_info_set_flags(CamelMessageInfo *mi, guint32 flags, guint32 set)
 		set |= CAMEL_MESSAGE_FOLDER_XEVCHANGE|CAMEL_MESSAGE_FOLDER_FLAGGED;
 	}
 
-	return CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->info_set_flags(mi, flags, set);
+	return CAMEL_FOLDER_SUMMARY_CLASS (camel_mbox_summary_parent_class)->info_set_flags(mi, flags, set);
 }
 #endif
 
 static void
-mbox_summary_class_init (CamelMboxSummaryClass *class)
+camel_mbox_summary_class_init (CamelMboxSummaryClass *class)
 {
 	CamelFolderSummaryClass *folder_summary_class;
 	CamelLocalSummaryClass *local_summary_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	folder_summary_class = CAMEL_FOLDER_SUMMARY_CLASS (class);
 	folder_summary_class->message_info_size = sizeof (CamelMboxMessageInfo);
 	folder_summary_class->content_info_size = sizeof (CamelMboxMessageContentInfo);
@@ -164,7 +162,7 @@ mbox_summary_class_init (CamelMboxSummaryClass *class)
 }
 
 static void
-mbox_summary_init (CamelMboxSummary *mbox_summary)
+camel_mbox_summary_init (CamelMboxSummary *mbox_summary)
 {
 	CamelFolderSummary *folder_summary;
 
@@ -174,24 +172,6 @@ mbox_summary_init (CamelMboxSummary *mbox_summary)
 	folder_summary->version += CAMEL_MBOX_SUMMARY_VERSION;
 }
 
-GType
-camel_mbox_summary_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_LOCAL_SUMMARY,
-			"CamelMboxSummary",
-			sizeof (CamelMboxSummaryClass),
-			(GClassInitFunc) mbox_summary_class_init,
-			sizeof (CamelMboxSummary),
-			(GInstanceInitFunc) mbox_summary_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_mbox_summary_new:
  *
@@ -248,7 +228,7 @@ summary_header_from_db (CamelFolderSummary *s, struct _CamelFIRecord *fir)
 	CamelMboxSummary *mbs = CAMEL_MBOX_SUMMARY(s);
 	gchar *part;
 
-	CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->summary_header_from_db(s, fir);
+	CAMEL_FOLDER_SUMMARY_CLASS (camel_mbox_summary_parent_class)->summary_header_from_db(s, fir);
 
 	part = fir->bdata;
 	if (part) {
@@ -264,7 +244,7 @@ summary_header_load(CamelFolderSummary *s, FILE *in)
 {
 	CamelMboxSummary *mbs = CAMEL_MBOX_SUMMARY(s);
 
-	if (CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->summary_header_load(s, in) == -1)
+	if (CAMEL_FOLDER_SUMMARY_CLASS (camel_mbox_summary_parent_class)->summary_header_load(s, in) == -1)
 		return -1;
 
 	/* legacy version */
@@ -288,7 +268,7 @@ summary_header_to_db (CamelFolderSummary *s, GError **error)
 	gchar *tmp;
 
 	/* Chain up to parent's summary_header_to_db() method. */
-	folder_summary_class = CAMEL_FOLDER_SUMMARY_CLASS (parent_class);
+	folder_summary_class = CAMEL_FOLDER_SUMMARY_CLASS (camel_mbox_summary_parent_class);
 	fir = folder_summary_class->summary_header_to_db (s, error);
 
 	if (fir) {
@@ -305,7 +285,7 @@ summary_header_save(CamelFolderSummary *s, FILE *out)
 {
 	CamelMboxSummary *mbs = CAMEL_MBOX_SUMMARY(s);
 
-	if (CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->summary_header_save(s, out) == -1)
+	if (CAMEL_FOLDER_SUMMARY_CLASS (camel_mbox_summary_parent_class)->summary_header_save(s, out) == -1)
 		return -1;
 
 	camel_file_util_encode_fixed_int32(out, CAMEL_MBOX_SUMMARY_VERSION);
@@ -319,7 +299,7 @@ message_info_new_from_header(CamelFolderSummary *s, GQueue *header_queue)
 	CamelMboxMessageInfo *mi;
 	CamelMboxSummary *mbs = (CamelMboxSummary *)s;
 
-	mi = (CamelMboxMessageInfo *)CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->message_info_new_from_header(s, header_queue);
+	mi = (CamelMboxMessageInfo *)CAMEL_FOLDER_SUMMARY_CLASS (camel_mbox_summary_parent_class)->message_info_new_from_header(s, header_queue);
 	if (mi) {
 		const gchar *xev, *uid;
 		CamelMboxMessageInfo *info = NULL;
@@ -399,7 +379,7 @@ message_info_new_from_parser(CamelFolderSummary *s, CamelMimeParser *mp)
 {
 	CamelMessageInfo *mi;
 
-	mi = CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->message_info_new_from_parser(s, mp);
+	mi = CAMEL_FOLDER_SUMMARY_CLASS (camel_mbox_summary_parent_class)->message_info_new_from_parser(s, mp);
 	if (mi) {
 		CamelMboxMessageInfo *mbi = (CamelMboxMessageInfo *)mi;
 
@@ -415,7 +395,7 @@ message_info_from_db(CamelFolderSummary *s, struct _CamelMIRecord *mir)
 	CamelMessageInfo *mi;
 	gchar *part;
 
-	mi = CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->message_info_from_db(s, mir);
+	mi = CAMEL_FOLDER_SUMMARY_CLASS (camel_mbox_summary_parent_class)->message_info_from_db(s, mir);
 
 	if (mi) {
 		CamelMboxMessageInfo *mbi = (CamelMboxMessageInfo *)mi;
@@ -435,7 +415,7 @@ message_info_load(CamelFolderSummary *s, FILE *in)
 
 	io(printf("loading mbox message info\n"));
 
-	mi = CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->message_info_load(s, in);
+	mi = CAMEL_FOLDER_SUMMARY_CLASS (camel_mbox_summary_parent_class)->message_info_load(s, in);
 	if (mi) {
 		CamelMboxMessageInfo *mbi = (CamelMboxMessageInfo *)mi;
 
@@ -456,7 +436,7 @@ meta_message_info_save(CamelFolderSummary *s, FILE *out_meta, FILE *out, CamelMe
 
 	io(printf("saving mbox message info\n"));
 
-	if (CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->meta_message_info_save(s, out_meta, out, mi) == -1
+	if (CAMEL_FOLDER_SUMMARY_CLASS (camel_mbox_summary_parent_class)->meta_message_info_save(s, out_meta, out, mi) == -1
 	    || camel_file_util_encode_off_t(out_meta, mbi->frompos) == -1)
 		return -1;
 
@@ -469,7 +449,7 @@ message_info_to_db(CamelFolderSummary *s, CamelMessageInfo *info)
 	CamelMboxMessageInfo *mbi = (CamelMboxMessageInfo *)info;
 	struct _CamelMIRecord *mir;
 
-	mir = CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->message_info_to_db(s, info);
+	mir = CAMEL_FOLDER_SUMMARY_CLASS (camel_mbox_summary_parent_class)->message_info_to_db(s, info);
 	mir->bdata = g_strdup_printf("%lu", mbi->frompos);
 
 	return mir;
@@ -482,7 +462,7 @@ message_info_save(CamelFolderSummary *s, FILE *out, CamelMessageInfo *mi)
 
 	io(printf("saving mbox message info\n"));
 
-	if (CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->message_info_save(s, out, mi) == -1
+	if (CAMEL_FOLDER_SUMMARY_CLASS (camel_mbox_summary_parent_class)->message_info_save(s, out, mi) == -1
 	    || camel_file_util_encode_off_t (out, mbi->frompos) == -1)
 		return -1;
 
@@ -1068,7 +1048,7 @@ mbox_summary_sync(CamelLocalSummary *cls, gboolean expunge, CamelFolderChangeInf
 		camel_folder_summary_touch(s);
 	}
 
-	return CAMEL_LOCAL_SUMMARY_CLASS (parent_class)->sync(cls, expunge, changeinfo, error);
+	return CAMEL_LOCAL_SUMMARY_CLASS (camel_mbox_summary_parent_class)->sync(cls, expunge, changeinfo, error);
 }
 
 gint
@@ -1302,7 +1282,7 @@ mbox_summary_add(CamelLocalSummary *cls, CamelMimeMessage *msg, const CamelMessa
 	CamelMboxMessageInfo *mi;
 
 	/* Chain up to parent's add() method. */
-	local_summary_class = CAMEL_LOCAL_SUMMARY_CLASS (parent_class);
+	local_summary_class = CAMEL_LOCAL_SUMMARY_CLASS (camel_mbox_summary_parent_class);
 	mi = (CamelMboxMessageInfo *) local_summary_class->add (
 		cls, msg, info, ci, error);
 	if (mi && ((CamelMboxSummary *)cls)->xstatus) {
diff --git a/camel/providers/local/camel-mh-folder.c b/camel/providers/local/camel-mh-folder.c
index 1b5756f..2e6041b 100644
--- a/camel/providers/local/camel-mh-folder.c
+++ b/camel/providers/local/camel-mh-folder.c
@@ -39,22 +39,20 @@
 
 #define d(x) /*(printf("%s(%d): ", __FILE__, __LINE__),(x))*/
 
-static gpointer parent_class;
-
 static CamelLocalSummary *mh_create_summary(CamelLocalFolder *lf, const gchar *path, const gchar *folder, CamelIndex *index);
 
 static gboolean mh_append_message(CamelFolder * folder, CamelMimeMessage * message, const CamelMessageInfo *info, gchar **appended_uid, GError **error);
 static CamelMimeMessage *mh_get_message(CamelFolder * folder, const gchar * uid, GError **error);
 static gchar * mh_get_filename (CamelFolder *folder, const gchar *uid, GError **error);
 
+G_DEFINE_TYPE (CamelMhFolder, camel_mh_folder, CAMEL_TYPE_LOCAL_FOLDER)
+
 static void
-mh_folder_class_init (CamelObjectClass *class)
+camel_mh_folder_class_init (CamelMhFolderClass *class)
 {
 	CamelFolderClass *folder_class;
 	CamelLocalFolderClass *local_folder_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	folder_class = CAMEL_FOLDER_CLASS (class);
 	folder_class->append_message = mh_append_message;
 	folder_class->get_message = mh_get_message;
@@ -64,22 +62,9 @@ mh_folder_class_init (CamelObjectClass *class)
 	local_folder_class->create_summary = mh_create_summary;
 }
 
-GType
-camel_mh_folder_get_type (void)
+static void
+camel_mh_folder_init (CamelMhFolder *mh_folder)
 {
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_LOCAL_FOLDER,
-			"CamelMhFolder",
-			sizeof (CamelMhFolderClass),
-			(GClassInitFunc) mh_folder_class_init,
-			sizeof (CamelMhFolder),
-			(GInstanceInitFunc) NULL,
-			0);
-
-	return type;
 }
 
 CamelFolder *
diff --git a/camel/providers/local/camel-mh-store.c b/camel/providers/local/camel-mh-store.c
index ec8f750..9e30037 100644
--- a/camel/providers/local/camel-mh-store.c
+++ b/camel/providers/local/camel-mh-store.c
@@ -35,8 +35,6 @@
 #include "camel-mh-store.h"
 #include "camel-mh-summary.h"
 
-static gpointer parent_class;
-
 #define d(x)
 
 static gboolean construct (CamelService *service, CamelSession *session, CamelProvider *provider, CamelURL *url, GError **error);
@@ -46,14 +44,14 @@ static gboolean delete_folder(CamelStore * store, const gchar *folder_name, GErr
 static gboolean rename_folder(CamelStore *store, const gchar *old, const gchar *new, GError **error);
 static CamelFolderInfo * get_folder_info (CamelStore *store, const gchar *top, guint32 flags, GError **error);
 
+G_DEFINE_TYPE (CamelMhStore, camel_mh_store, CAMEL_TYPE_LOCAL_STORE)
+
 static void
-mh_store_class_init (CamelObjectClass *class)
+camel_mh_store_class_init (CamelMhStoreClass *class)
 {
 	CamelServiceClass *service_class;
 	CamelStoreClass *store_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	service_class = CAMEL_SERVICE_CLASS (class);
 	service_class->construct = construct;
 
@@ -65,22 +63,9 @@ mh_store_class_init (CamelObjectClass *class)
 	store_class->get_folder_info = get_folder_info;
 }
 
-GType
-camel_mh_store_get_type (void)
+static void
+camel_mh_store_init (CamelMhStore *mh_store)
 {
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_LOCAL_STORE,
-			"CamelMhStore",
-			sizeof (CamelMhStoreClass),
-			(GClassInitFunc) mh_store_class_init,
-			sizeof (CamelMhStore),
-			(GInstanceInitFunc) NULL,
-			0);
-
-	return type;
 }
 
 static gboolean
@@ -94,7 +79,7 @@ construct (CamelService *service,
 	CamelMhStore *mh_store = (CamelMhStore *)service;
 
 	/* Chain up to parent's construct() method. */
-	service_class = CAMEL_SERVICE_CLASS (parent_class);
+	service_class = CAMEL_SERVICE_CLASS (camel_mh_store_parent_class);
 	if (!service_class->construct (service, session, provider, url, error))
 		return FALSE;
 
@@ -215,7 +200,7 @@ get_folder (CamelStore *store,
 	struct stat st;
 
 	/* Chain up to parent's get_folder() method. */
-	store_class = CAMEL_STORE_CLASS (parent_class);
+	store_class = CAMEL_STORE_CLASS (camel_mh_store_parent_class);
 	if (store_class->get_folder (store, folder_name, flags, error) == NULL)
 		return NULL;
 
@@ -311,7 +296,7 @@ delete_folder (CamelStore *store,
 		folders_update(((CamelLocalStore *)store)->toplevel_dir, UPDATE_REMOVE, folder_name, NULL);
 
 	/* Chain up to parent's delete_folder() method. */
-	store_class = CAMEL_STORE_CLASS (parent_class);
+	store_class = CAMEL_STORE_CLASS (camel_mh_store_parent_class);
 	return store_class->delete_folder (store, folder_name, error);
 }
 
@@ -324,7 +309,7 @@ rename_folder (CamelStore *store,
 	CamelStoreClass *store_class;
 
 	/* Chain up to parent's rename_folder() method. */
-	store_class = CAMEL_STORE_CLASS (parent_class);
+	store_class = CAMEL_STORE_CLASS (camel_mh_store_parent_class);
 	if (!store_class->rename_folder (store, old, new, error))
 		return FALSE;
 
diff --git a/camel/providers/local/camel-mh-summary.c b/camel/providers/local/camel-mh-summary.c
index 18f5e0a..2ce55b1 100644
--- a/camel/providers/local/camel-mh-summary.c
+++ b/camel/providers/local/camel-mh-summary.c
@@ -57,15 +57,14 @@ struct _CamelMhSummaryPrivate {
 	gchar *current_uid;
 };
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelMhSummary, camel_mh_summary, CAMEL_TYPE_LOCAL_SUMMARY)
 
 static void
-mh_summary_class_init (CamelMhSummaryClass *class)
+camel_mh_summary_class_init (CamelMhSummaryClass *class)
 {
 	CamelFolderSummaryClass *folder_summary_class;
 	CamelLocalSummaryClass *local_summary_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelMhSummaryPrivate));
 
 	folder_summary_class = CAMEL_FOLDER_SUMMARY_CLASS (class);
@@ -78,7 +77,7 @@ mh_summary_class_init (CamelMhSummaryClass *class)
 }
 
 static void
-mh_summary_init (CamelMhSummary *mh_summary)
+camel_mh_summary_init (CamelMhSummary *mh_summary)
 {
 	CamelFolderSummary *folder_summary;
 
@@ -90,24 +89,6 @@ mh_summary_init (CamelMhSummary *mh_summary)
 	folder_summary->version += CAMEL_MH_SUMMARY_VERSION;
 }
 
-GType
-camel_mh_summary_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_LOCAL_SUMMARY,
-			"CamelMhSummary",
-			sizeof (CamelMhSummaryClass),
-			(GClassInitFunc) mh_summary_class_init,
-			sizeof (CamelMhSummary),
-			(GInstanceInitFunc) mh_summary_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_mh_summary_new:
  *
@@ -347,6 +328,6 @@ mh_summary_sync (CamelLocalSummary *cls,
 	}
 
 	/* Chain up to parent's sync() method. */
-	local_summary_class = CAMEL_LOCAL_SUMMARY_CLASS (parent_class);
+	local_summary_class = CAMEL_LOCAL_SUMMARY_CLASS (camel_mh_summary_parent_class);
 	return local_summary_class->sync (cls, expunge, changes, error);
 }
diff --git a/camel/providers/local/camel-spool-folder.c b/camel/providers/local/camel-spool-folder.c
index 210e35c..a58f70b 100644
--- a/camel/providers/local/camel-spool-folder.c
+++ b/camel/providers/local/camel-spool-folder.c
@@ -40,20 +40,18 @@
 
 #define d(x) /*(printf("%s(%d): ", __FILE__, __LINE__),(x))*/
 
-static gpointer parent_class;
-
 static CamelLocalSummary *spool_create_summary(CamelLocalFolder *lf, const gchar *path, const gchar *folder, CamelIndex *index);
 
 static gint spool_lock(CamelLocalFolder *lf, CamelLockType type, GError **error);
 static void spool_unlock(CamelLocalFolder *lf);
 
+G_DEFINE_TYPE (CamelSpoolFolder, camel_spool_folder, CAMEL_TYPE_MBOX_FOLDER)
+
 static void
-spool_folder_class_init (CamelSpoolFolderClass *class)
+camel_spool_folder_class_init (CamelSpoolFolderClass *class)
 {
 	CamelLocalFolderClass *local_folder_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	local_folder_class = CAMEL_LOCAL_FOLDER_CLASS (class);
 	local_folder_class->create_summary = spool_create_summary;
 	local_folder_class->lock = spool_lock;
@@ -61,29 +59,11 @@ spool_folder_class_init (CamelSpoolFolderClass *class)
 }
 
 static void
-spool_folder_init (CamelSpoolFolder *spool_folder)
+camel_spool_folder_init (CamelSpoolFolder *spool_folder)
 {
 	spool_folder->lockid = -1;
 }
 
-GType
-camel_spool_folder_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_MBOX_FOLDER,
-			"CamelSpoolFolder",
-			sizeof (CamelSpoolFolderClass),
-			(GClassInitFunc) spool_folder_class_init,
-			sizeof (CamelSpoolFolder),
-			(GInstanceInitFunc) spool_folder_init,
-			0);
-
-	return type;
-}
-
 CamelFolder *
 camel_spool_folder_new (CamelStore *parent_store,
                         const gchar *full_name,
diff --git a/camel/providers/local/camel-spool-store.c b/camel/providers/local/camel-spool-store.c
index 11504c6..47fbba5 100644
--- a/camel/providers/local/camel-spool-store.c
+++ b/camel/providers/local/camel-spool-store.c
@@ -58,17 +58,15 @@ static gboolean delete_folder(CamelStore *store, const gchar *folder_name, GErro
 static gchar *spool_get_meta_path(CamelLocalStore *ls, const gchar *full_name, const gchar *ext);
 static gchar *spool_get_full_path(CamelLocalStore *ls, const gchar *full_name);
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelSpoolStore, camel_spool_store, CAMEL_TYPE_MBOX_STORE)
 
 static void
-spool_store_class_init (CamelSpoolStoreClass *class)
+camel_spool_store_class_init (CamelSpoolStoreClass *class)
 {
 	CamelServiceClass *service_class;
 	CamelStoreClass *store_class;
 	CamelLocalStoreClass *local_store_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	service_class = CAMEL_SERVICE_CLASS (class);
 	service_class->construct = construct;
 	service_class->get_name = get_name;
@@ -86,22 +84,9 @@ spool_store_class_init (CamelSpoolStoreClass *class)
 	local_store_class->get_meta_path = spool_get_meta_path;
 }
 
-GType
-camel_spool_store_get_type (void)
+static void
+camel_spool_store_init (CamelSpoolStore *spool_store)
 {
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_MBOX_STORE,
-			"CamelSpoolStore",
-			sizeof (CamelSpoolStoreClass),
-			(GClassInitFunc) spool_store_class_init,
-			sizeof (CamelSpoolStore),
-			(GInstanceInitFunc) NULL,
-			0);
-
-	return type;
 }
 
 static gboolean
@@ -118,7 +103,7 @@ construct (CamelService *service,
 		 G_OBJECT_CLASS_NAME(((CamelObject *)service)->s.type), url->protocol, url->path));
 
 	/* Chain up to parent's construct() method. */
-	service_class = CAMEL_SERVICE_CLASS (parent_class);
+	service_class = CAMEL_SERVICE_CLASS (camel_spool_store_parent_class);
 	if (!service_class->construct (service, session, provider, url, error))
 		return FALSE;
 
diff --git a/camel/providers/local/camel-spool-summary.c b/camel/providers/local/camel-spool-summary.c
index 19ab96d..bd08422 100644
--- a/camel/providers/local/camel-spool-summary.c
+++ b/camel/providers/local/camel-spool-summary.c
@@ -48,16 +48,14 @@ static gint spool_summary_check(CamelLocalSummary *cls, CamelFolderChangeInfo *c
 static gint spool_summary_sync_full(CamelMboxSummary *cls, gboolean expunge, CamelFolderChangeInfo *changeinfo, GError **error);
 static gint spool_summary_need_index(void);
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelSpoolSummary, camel_spool_summary, CAMEL_TYPE_MBOX_SUMMARY)
 
 static void
-spool_summary_class_init (CamelSpoolSummaryClass *class)
+camel_spool_summary_class_init (CamelSpoolSummaryClass *class)
 {
 	CamelLocalSummaryClass *local_summary_class;
 	CamelMboxSummaryClass *mbox_summary_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	local_summary_class = CAMEL_LOCAL_SUMMARY_CLASS (class);
 	local_summary_class->load = spool_summary_load;
 	local_summary_class->check = spool_summary_check;
@@ -68,7 +66,7 @@ spool_summary_class_init (CamelSpoolSummaryClass *class)
 }
 
 static void
-spool_summary_init(CamelSpoolSummary *spool_summary)
+camel_spool_summary_init(CamelSpoolSummary *spool_summary)
 {
 	CamelFolderSummary *folder_summary;
 
@@ -80,24 +78,6 @@ spool_summary_init(CamelSpoolSummary *spool_summary)
 	folder_summary->version += CAMEL_SPOOL_SUMMARY_VERSION;
 }
 
-GType
-camel_spool_summary_get_type(void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_MBOX_SUMMARY,
-			"CamelSpoolSummary",
-			sizeof (CamelSpoolSummaryClass),
-			(GClassInitFunc) spool_summary_class_init,
-			sizeof (CamelSpoolSummary),
-			(GInstanceInitFunc) spool_summary_init,
-			0);
-
-	return type;
-}
-
 CamelSpoolSummary *
 camel_spool_summary_new (CamelFolder *folder,
                          const gchar *mbox_name)
@@ -325,7 +305,7 @@ spool_summary_check (CamelLocalSummary *cls,
 	struct stat st;
 	CamelFolderSummary *s = (CamelFolderSummary *)cls;
 
-	if (CAMEL_LOCAL_SUMMARY_CLASS (parent_class)->check(cls, changeinfo, error) == -1)
+	if (CAMEL_LOCAL_SUMMARY_CLASS (camel_spool_summary_parent_class)->check(cls, changeinfo, error) == -1)
 		return -1;
 
 	/* check to see if we need to copy/update the file; missing xev headers prompt this */
diff --git a/camel/providers/nntp/camel-nntp-folder.c b/camel/providers/nntp/camel-nntp-folder.c
index 6fba7af..cc740f3 100644
--- a/camel/providers/nntp/camel-nntp-folder.c
+++ b/camel/providers/nntp/camel-nntp-folder.c
@@ -47,7 +47,7 @@
 	(G_TYPE_INSTANCE_GET_PRIVATE \
 	((obj), CAMEL_TYPE_NNTP_FOLDER, CamelNNTPFolderPrivate))
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelNNTPFolder, camel_nntp_folder, CAMEL_TYPE_DISCO_FOLDER)
 
 static void
 nntp_folder_finalize (GObject *object)
@@ -61,7 +61,7 @@ nntp_folder_finalize (GObject *object)
 	g_mutex_free (nntp_folder->priv->cache_lock);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_nntp_folder_parent_class)->finalize (object);
 }
 
 gboolean
@@ -481,23 +481,12 @@ nntp_folder_transfer_message (CamelFolder *source,
 }
 
 static void
-nntp_folder_init (CamelNNTPFolder *nntp_folder)
-{
-	nntp_folder->priv = CAMEL_NNTP_FOLDER_GET_PRIVATE (nntp_folder);
-
-	nntp_folder->changes = camel_folder_change_info_new ();
-	nntp_folder->priv->search_lock = g_mutex_new ();
-	nntp_folder->priv->cache_lock = g_mutex_new ();
-}
-
-static void
-nntp_folder_class_init (CamelNNTPFolderClass *class)
+camel_nntp_folder_class_init (CamelNNTPFolderClass *class)
 {
 	GObjectClass *object_class;
 	CamelFolderClass *folder_class;
 	CamelDiscoFolderClass *disco_folder_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelNNTPFolderPrivate));
 
 	folder_class = CAMEL_FOLDER_CLASS (g_type_class_peek (CAMEL_TYPE_FOLDER));
@@ -527,22 +516,14 @@ nntp_folder_class_init (CamelNNTPFolderClass *class)
 	disco_folder_class->refresh_info_online = nntp_folder_refresh_info_online;
 }
 
-GType
-camel_nntp_folder_get_type (void)
+static void
+camel_nntp_folder_init (CamelNNTPFolder *nntp_folder)
 {
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_DISCO_FOLDER,
-			"CamelNNTPFolder",
-			sizeof (CamelNNTPFolderClass),
-			(GClassInitFunc) nntp_folder_class_init,
-			sizeof (CamelNNTPFolder),
-			(GInstanceInitFunc) nntp_folder_init,
-			0);
-
-	return type;
+	nntp_folder->priv = CAMEL_NNTP_FOLDER_GET_PRIVATE (nntp_folder);
+
+	nntp_folder->changes = camel_folder_change_info_new ();
+	nntp_folder->priv->search_lock = g_mutex_new ();
+	nntp_folder->priv->cache_lock = g_mutex_new ();
 }
 
 CamelFolder *
diff --git a/camel/providers/nntp/camel-nntp-store-summary.c b/camel/providers/nntp/camel-nntp-store-summary.c
index 84ac5cb..ee5c1f8 100644
--- a/camel/providers/nntp/camel-nntp-store-summary.c
+++ b/camel/providers/nntp/camel-nntp-store-summary.c
@@ -51,15 +51,13 @@ static void		 store_info_free(CamelStoreSummary *, CamelStoreInfo *);
 static const gchar *store_info_string(CamelStoreSummary *, const CamelStoreInfo *, gint);
 static void store_info_set_string(CamelStoreSummary *, CamelStoreInfo *, int, const gchar *);
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelNNTPStoreSummary, camel_nntp_store_summary, CAMEL_TYPE_STORE_SUMMARY)
 
 static void
-nntp_store_summary_class_init (CamelNNTPStoreSummaryClass *class)
+camel_nntp_store_summary_class_init (CamelNNTPStoreSummaryClass *class)
 {
 	CamelStoreSummaryClass *store_summary_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	store_summary_class = CAMEL_STORE_SUMMARY_CLASS (class);
 	store_summary_class->summary_header_load = summary_header_load;
 	store_summary_class->summary_header_save = summary_header_save;
@@ -71,7 +69,7 @@ nntp_store_summary_class_init (CamelNNTPStoreSummaryClass *class)
 }
 
 static void
-nntp_store_summary_init (CamelNNTPStoreSummary *nntp_store_summary)
+camel_nntp_store_summary_init (CamelNNTPStoreSummary *nntp_store_summary)
 {
 	CamelStoreSummary *store_summary;
 
@@ -85,24 +83,6 @@ nntp_store_summary_init (CamelNNTPStoreSummary *nntp_store_summary)
 		sizeof (nntp_store_summary->last_newslist));
 }
 
-GType
-camel_nntp_store_summary_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_STORE_SUMMARY,
-			"CamelNNTPStoreSummary",
-			sizeof (CamelNNTPStoreSummaryClass),
-			(GClassInitFunc) nntp_store_summary_class_init,
-			sizeof (CamelNNTPStoreSummary),
-			(GInstanceInitFunc) nntp_store_summary_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_nntp_store_summary_new:
  *
@@ -298,7 +278,7 @@ summary_header_load (CamelStoreSummary *s, FILE *in)
 	CamelNNTPStoreSummary *is = (CamelNNTPStoreSummary *) s;
 	gint32 version, nil;
 
-	if (CAMEL_STORE_SUMMARY_CLASS (parent_class)->summary_header_load ((CamelStoreSummary *) s, in) == -1
+	if (CAMEL_STORE_SUMMARY_CLASS (camel_nntp_store_summary_parent_class)->summary_header_load ((CamelStoreSummary *) s, in) == -1
 	    || camel_file_util_decode_fixed_int32 (in, &version) == -1)
 		return -1;
 
@@ -323,7 +303,7 @@ summary_header_save (CamelStoreSummary *s, FILE *out)
 	CamelNNTPStoreSummary *is = (CamelNNTPStoreSummary *) s;
 
 	/* always write as latest version */
-	if (CAMEL_STORE_SUMMARY_CLASS (parent_class)->summary_header_save ((CamelStoreSummary *) s, out) == -1
+	if (CAMEL_STORE_SUMMARY_CLASS (camel_nntp_store_summary_parent_class)->summary_header_save ((CamelStoreSummary *) s, out) == -1
 	    || camel_file_util_encode_fixed_int32 (out, CAMEL_NNTP_STORE_SUMMARY_VERSION) == -1
 	    || fwrite (is->last_newslist, 1, NNTP_DATE_SIZE, out) < NNTP_DATE_SIZE
 	    || camel_file_util_encode_fixed_int32 (out, 0) == -1)
@@ -337,7 +317,7 @@ store_info_load (CamelStoreSummary *s, FILE *in)
 {
 	CamelNNTPStoreInfo *ni;
 
-	ni = (CamelNNTPStoreInfo *) CAMEL_STORE_SUMMARY_CLASS (parent_class)->store_info_load (s, in);
+	ni = (CamelNNTPStoreInfo *) CAMEL_STORE_SUMMARY_CLASS (camel_nntp_store_summary_parent_class)->store_info_load (s, in);
 	if (ni) {
 		if (camel_file_util_decode_string (in, &ni->full_name) == -1) {
 			camel_store_summary_info_free (s, (CamelStoreInfo *) ni);
@@ -361,7 +341,7 @@ store_info_save (CamelStoreSummary *s, FILE *out, CamelStoreInfo *mi)
 {
 	CamelNNTPStoreInfo *isi = (CamelNNTPStoreInfo *)mi;
 
-	if (CAMEL_STORE_SUMMARY_CLASS (parent_class)->store_info_save (s, out, mi) == -1
+	if (CAMEL_STORE_SUMMARY_CLASS (camel_nntp_store_summary_parent_class)->store_info_save (s, out, mi) == -1
 	    || camel_file_util_encode_string (out, isi->full_name) == -1
 	    || camel_file_util_encode_uint32(out, isi->first) == -1
 	    || camel_file_util_encode_uint32(out, isi->last) == -1)
@@ -376,7 +356,7 @@ store_info_free (CamelStoreSummary *s, CamelStoreInfo *mi)
 	CamelNNTPStoreInfo *nsi = (CamelNNTPStoreInfo *) mi;
 
 	g_free (nsi->full_name);
-	CAMEL_STORE_SUMMARY_CLASS (parent_class)->store_info_free (s, mi);
+	CAMEL_STORE_SUMMARY_CLASS (camel_nntp_store_summary_parent_class)->store_info_free (s, mi);
 }
 
 static const gchar *
@@ -392,7 +372,7 @@ store_info_string(CamelStoreSummary *s, const CamelStoreInfo *mi, gint type)
 	case CAMEL_NNTP_STORE_INFO_FULL_NAME:
 		return nsi->full_name;
 	default:
-		return CAMEL_STORE_SUMMARY_CLASS (parent_class)->store_info_string(s, mi, type);
+		return CAMEL_STORE_SUMMARY_CLASS (camel_nntp_store_summary_parent_class)->store_info_string(s, mi, type);
 	}
 }
 
@@ -412,7 +392,7 @@ store_info_set_string(CamelStoreSummary *s, CamelStoreInfo *mi, gint type, const
 		CAMEL_STORE_SUMMARY_UNLOCK(s, summary_lock);
 		break;
 	default:
-		CAMEL_STORE_SUMMARY_CLASS (parent_class)->store_info_set_string (s, mi, type, str);
+		CAMEL_STORE_SUMMARY_CLASS (camel_nntp_store_summary_parent_class)->store_info_set_string (s, mi, type, str);
 		break;
 	}
 }
diff --git a/camel/providers/nntp/camel-nntp-store.c b/camel/providers/nntp/camel-nntp-store.c
index 29d55c9..25c00e2 100644
--- a/camel/providers/nntp/camel-nntp-store.c
+++ b/camel/providers/nntp/camel-nntp-store.c
@@ -55,10 +55,10 @@
 	(G_TYPE_INSTANCE_GET_PRIVATE \
 	((obj), CAMEL_TYPE_NNTP_STORE, CamelNNTPStorePrivate))
 
-static gpointer parent_class;
-
 static gint camel_nntp_try_authenticate (CamelNNTPStore *store, GError **error);
 
+G_DEFINE_TYPE (CamelNNTPStore, camel_nntp_store, CAMEL_TYPE_DISCO_STORE)
+
 static void
 nntp_store_dispose (GObject *object)
 {
@@ -97,7 +97,7 @@ nntp_store_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_nntp_store_parent_class)->dispose (object);
 }
 
 static void
@@ -117,7 +117,7 @@ nntp_store_finalize (GObject *object)
 	}
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_nntp_store_parent_class)->finalize (object);
 }
 
 static gboolean
@@ -403,7 +403,7 @@ nntp_disconnect_online (CamelService *service, gboolean clean, GError **error)
 	CamelServiceClass *service_class;
 	gchar *line;
 
-	service_class = CAMEL_SERVICE_CLASS (parent_class);
+	service_class = CAMEL_SERVICE_CLASS (camel_nntp_store_parent_class);
 
 	CAMEL_SERVICE_REC_LOCK(store, connect_lock);
 
@@ -433,7 +433,7 @@ nntp_disconnect_offline (CamelService *service, gboolean clean, GError **error)
 	CamelServiceClass *service_class;
 
 	/* Chain up to parent's disconnect() method. */
-	service_class = CAMEL_SERVICE_CLASS (parent_class);
+	service_class = CAMEL_SERVICE_CLASS (camel_nntp_store_parent_class);
 	if (!service_class->disconnect (service, clean, error))
 		return FALSE;
 
@@ -1079,7 +1079,7 @@ nntp_construct (CamelService *service, CamelSession *session,
 	gchar *tmp;
 
 	/* construct the parent first */
-	service_class = CAMEL_SERVICE_CLASS (parent_class);
+	service_class = CAMEL_SERVICE_CLASS (camel_nntp_store_parent_class);
 	if (!service_class->construct (service, session, provider, url, error))
 		return FALSE;
 
@@ -1126,14 +1126,13 @@ nntp_construct (CamelService *service, CamelSession *session,
 }
 
 static void
-nntp_store_class_init (CamelNNTPStoreClass *class)
+camel_nntp_store_class_init (CamelNNTPStoreClass *class)
 {
 	GObjectClass *object_class;
 	CamelServiceClass *service_class;
 	CamelStoreClass *store_class;
 	CamelDiscoStoreClass *disco_store_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelNNTPStorePrivate));
 
 	object_class = G_OBJECT_CLASS (class);
@@ -1170,7 +1169,7 @@ nntp_store_class_init (CamelNNTPStoreClass *class)
 }
 
 static void
-nntp_store_init (CamelNNTPStore *nntp_store)
+camel_nntp_store_init (CamelNNTPStore *nntp_store)
 {
 	CamelStore *store = CAMEL_STORE (nntp_store);
 
@@ -1181,24 +1180,6 @@ nntp_store_init (CamelNNTPStore *nntp_store)
 	nntp_store->priv = CAMEL_NNTP_STORE_GET_PRIVATE (nntp_store);
 }
 
-GType
-camel_nntp_store_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_DISCO_STORE,
-			"CamelNNTPStore",
-			sizeof (CamelNNTPStoreClass),
-			(GClassInitFunc) nntp_store_class_init,
-			sizeof (CamelNNTPStore),
-			(GInstanceInitFunc) nntp_store_init,
-			0);
-
-	return type;
-}
-
 static gint
 camel_nntp_try_authenticate (CamelNNTPStore *store, GError **error)
 {
diff --git a/camel/providers/nntp/camel-nntp-stream.c b/camel/providers/nntp/camel-nntp-stream.c
index 6d5d5c0..46e10f1 100644
--- a/camel/providers/nntp/camel-nntp-stream.c
+++ b/camel/providers/nntp/camel-nntp-stream.c
@@ -36,11 +36,11 @@
 #define ECONNRESET EIO
 #endif
 
-static gpointer parent_class;
-
 #define CAMEL_NNTP_STREAM_SIZE (4096)
 #define CAMEL_NNTP_STREAM_LINE_SIZE (1024) /* maximum line size */
 
+G_DEFINE_TYPE (CamelNNTPStream, camel_nntp_stream, CAMEL_TYPE_STREAM)
+
 static void
 nntp_stream_dispose (GObject *object)
 {
@@ -52,7 +52,7 @@ nntp_stream_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose () method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_nntp_stream_parent_class)->dispose (object);
 }
 
 static void
@@ -64,7 +64,7 @@ nntp_stream_finalize (GObject *object)
 	g_free (stream->linebuf);
 
 	/* Chain up to parent's finalize () method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_nntp_stream_parent_class)->finalize (object);
 }
 
 static gint
@@ -213,13 +213,11 @@ nntp_stream_reset (CamelStream *stream,
 }
 
 static void
-nntp_stream_class_init (CamelStreamClass *class)
+camel_nntp_stream_class_init (CamelNNTPStreamClass *class)
 {
 	GObjectClass *object_class;
 	CamelStreamClass *stream_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->dispose = nntp_stream_dispose;
 	object_class->finalize = nntp_stream_finalize;
@@ -234,7 +232,7 @@ nntp_stream_class_init (CamelStreamClass *class)
 }
 
 static void
-nntp_stream_init (CamelNNTPStream *is)
+camel_nntp_stream_init (CamelNNTPStream *is)
 {
 	/* +1 is room for appending a 0 if we need to for a line */
 	is->ptr = is->end = is->buf = g_malloc (CAMEL_NNTP_STREAM_SIZE+1);
@@ -248,24 +246,6 @@ nntp_stream_init (CamelNNTPStream *is)
 	is->mode = CAMEL_NNTP_STREAM_LINE;
 }
 
-GType
-camel_nntp_stream_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_STREAM,
-			"CamelNNTPStream",
-			sizeof (CamelNNTPStreamClass),
-			(GClassInitFunc) nntp_stream_class_init,
-			sizeof (CamelNNTPStream),
-			(GInstanceInitFunc) nntp_stream_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_nntp_stream_new:
  *
diff --git a/camel/providers/nntp/camel-nntp-summary.c b/camel/providers/nntp/camel-nntp-summary.c
index 5657c1c..c8215bc 100644
--- a/camel/providers/nntp/camel-nntp-summary.c
+++ b/camel/providers/nntp/camel-nntp-summary.c
@@ -64,14 +64,13 @@ static gint summary_header_save (CamelFolderSummary *, FILE *);
 static gint summary_header_from_db (CamelFolderSummary *s, CamelFIRecord *mir);
 static CamelFIRecord * summary_header_to_db (CamelFolderSummary *s, GError **error);
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelNNTPSummary, camel_nntp_summary, CAMEL_TYPE_FOLDER_SUMMARY)
 
 static void
-nntp_summary_class_init (CamelNNTPSummaryClass *class)
+camel_nntp_summary_class_init (CamelNNTPSummaryClass *class)
 {
 	CamelFolderSummaryClass *folder_summary_class;
 
-	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (CamelNNTPSummaryPrivate));
 
 	folder_summary_class = CAMEL_FOLDER_SUMMARY_CLASS (class);
@@ -85,7 +84,7 @@ nntp_summary_class_init (CamelNNTPSummaryClass *class)
 }
 
 static void
-nntp_summary_init (CamelNNTPSummary *nntp_summary)
+camel_nntp_summary_init (CamelNNTPSummary *nntp_summary)
 {
 	CamelFolderSummary *summary = CAMEL_FOLDER_SUMMARY (nntp_summary);
 
@@ -95,24 +94,6 @@ nntp_summary_init (CamelNNTPSummary *nntp_summary)
 	summary->version += CAMEL_NNTP_SUMMARY_VERSION;
 }
 
-GType
-camel_nntp_summary_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_FOLDER_SUMMARY,
-			"CamelNNTPSummary",
-			sizeof (CamelNNTPSummaryClass),
-			(GClassInitFunc) nntp_summary_class_init,
-			sizeof (CamelNNTPSummary),
-			(GInstanceInitFunc) nntp_summary_init,
-			0);
-
-	return type;
-}
-
 CamelNNTPSummary *
 camel_nntp_summary_new (struct _CamelFolder *folder, const gchar *path)
 {
@@ -138,7 +119,7 @@ message_info_new_from_header (CamelFolderSummary *s,
 	if (cns->priv->uid == NULL)
 		return NULL;
 
-	mi = (CamelMessageInfoBase *)CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->message_info_new_from_header (s, header_queue);
+	mi = (CamelMessageInfoBase *)CAMEL_FOLDER_SUMMARY_CLASS (camel_nntp_summary_parent_class)->message_info_new_from_header (s, header_queue);
 	if (mi) {
 		camel_pstring_free (mi->uid);
 		mi->uid = camel_pstring_strdup (cns->priv->uid);
@@ -155,7 +136,7 @@ summary_header_from_db (CamelFolderSummary *s, CamelFIRecord *mir)
 	CamelNNTPSummary *cns = CAMEL_NNTP_SUMMARY (s);
 	gchar *part;
 
-	if (CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->summary_header_from_db (s, mir) == -1)
+	if (CAMEL_FOLDER_SUMMARY_CLASS (camel_nntp_summary_parent_class)->summary_header_from_db (s, mir) == -1)
 		return -1;
 
 	part = mir->bdata;
@@ -180,7 +161,7 @@ summary_header_load (CamelFolderSummary *s, FILE *in)
 {
 	CamelNNTPSummary *cns = CAMEL_NNTP_SUMMARY (s);
 
-	if (CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->summary_header_load (s, in) == -1)
+	if (CAMEL_FOLDER_SUMMARY_CLASS (camel_nntp_summary_parent_class)->summary_header_load (s, in) == -1)
 		return -1;
 
 	/* Legacy version */
@@ -211,7 +192,7 @@ summary_header_to_db (CamelFolderSummary *s, GError **error)
 	CamelNNTPSummary *cns = CAMEL_NNTP_SUMMARY (s);
 	struct _CamelFIRecord *fir;
 
-	fir = CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->summary_header_to_db (s, error);
+	fir = CAMEL_FOLDER_SUMMARY_CLASS (camel_nntp_summary_parent_class)->summary_header_to_db (s, error);
 	if (!fir)
 		return NULL;
 	fir->bdata = g_strdup_printf ("%d %d %d", CAMEL_NNTP_SUMMARY_VERSION, cns->high, cns->low);
@@ -224,7 +205,7 @@ summary_header_save (CamelFolderSummary *s, FILE *out)
 {
 	CamelNNTPSummary *cns = CAMEL_NNTP_SUMMARY (s);
 
-	if (CAMEL_FOLDER_SUMMARY_CLASS (parent_class)->summary_header_save (s, out) == -1
+	if (CAMEL_FOLDER_SUMMARY_CLASS (camel_nntp_summary_parent_class)->summary_header_save (s, out) == -1
 	    || camel_file_util_encode_fixed_int32 (out, CAMEL_NNTP_SUMMARY_VERSION) == -1
 	    || camel_file_util_encode_fixed_int32 (out, cns->high) == -1
 	    || camel_file_util_encode_fixed_int32 (out, cns->low) == -1)
diff --git a/camel/providers/pop3/camel-pop3-engine.c b/camel/providers/pop3/camel-pop3-engine.c
index 2d35bbf..8d4b936 100644
--- a/camel/providers/pop3/camel-pop3-engine.c
+++ b/camel/providers/pop3/camel-pop3-engine.c
@@ -44,7 +44,7 @@ extern CamelServiceAuthType camel_pop3_apop_authtype;
 
 static void get_capabilities(CamelPOP3Engine *pe);
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelPOP3Engine, camel_pop3_engine, CAMEL_TYPE_OBJECT)
 
 static void
 pop3_engine_dispose (GObject *object)
@@ -57,7 +57,7 @@ pop3_engine_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_pop3_engine_parent_class)->dispose (object);
 }
 
 static void
@@ -71,7 +71,7 @@ pop3_engine_finalize (GObject *object)
 	g_free (engine->apop);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_pop3_engine_parent_class)->finalize (object);
 }
 
 static void
@@ -79,8 +79,6 @@ camel_pop3_engine_class_init (CamelPOP3EngineClass *class)
 {
 	GObjectClass *object_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->dispose = pop3_engine_dispose;
 	object_class->finalize = pop3_engine_finalize;
@@ -95,24 +93,6 @@ camel_pop3_engine_init (CamelPOP3Engine *engine)
 	engine->state = CAMEL_POP3_ENGINE_DISCONNECT;
 }
 
-GType
-camel_pop3_engine_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_OBJECT,
-			"CamelPOP3Engine",
-			sizeof (CamelPOP3EngineClass),
-			(GClassInitFunc) camel_pop3_engine_class_init,
-			sizeof (CamelPOP3Engine),
-			(GInstanceInitFunc) camel_pop3_engine_init,
-			0);
-
-	return type;
-}
-
 static gint
 read_greeting (CamelPOP3Engine *pe)
 {
diff --git a/camel/providers/pop3/camel-pop3-folder.c b/camel/providers/pop3/camel-pop3-folder.c
index ba5d1b0..dddfd10 100644
--- a/camel/providers/pop3/camel-pop3-folder.c
+++ b/camel/providers/pop3/camel-pop3-folder.c
@@ -38,8 +38,6 @@
 
 #define d(x)
 
-static gpointer parent_class;
-
 static gboolean pop3_refresh_info (CamelFolder *folder, GError **error);
 static gboolean pop3_sync (CamelFolder *folder, gboolean expunge, GError **error);
 static gint pop3_get_message_count (CamelFolder *folder);
@@ -48,6 +46,8 @@ static CamelMimeMessage *pop3_get_message (CamelFolder *folder, const gchar *uid
 static gboolean pop3_set_message_flags (CamelFolder *folder, const gchar *uid, guint32 flags, guint32 set);
 static gchar * pop3_get_filename (CamelFolder *folder, const gchar *uid, GError **error);
 
+G_DEFINE_TYPE (CamelPOP3Folder, camel_pop3_folder, CAMEL_TYPE_FOLDER)
+
 static void
 pop3_folder_finalize (GObject *object)
 {
@@ -73,7 +73,7 @@ pop3_folder_finalize (GObject *object)
 	}
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_pop3_folder_parent_class)->finalize (object);
 }
 
 static void
@@ -82,8 +82,6 @@ camel_pop3_folder_class_init (CamelPOP3FolderClass *class)
 	GObjectClass *object_class;
 	CamelFolderClass *folder_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->finalize = pop3_folder_finalize;
 
@@ -98,22 +96,9 @@ camel_pop3_folder_class_init (CamelPOP3FolderClass *class)
 	folder_class->set_message_flags = pop3_set_message_flags;
 }
 
-GType
-camel_pop3_folder_get_type (void)
+static void
+camel_pop3_folder_init (CamelPOP3Folder *pop3_folder)
 {
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_FOLDER,
-			"CamelPOP3Folder",
-			sizeof (CamelPOP3FolderClass),
-			(GClassInitFunc) camel_pop3_folder_class_init,
-			sizeof (CamelPOP3Folder),
-			(GInstanceInitFunc) NULL,
-			0);
-
-	return type;
 }
 
 CamelFolder *
diff --git a/camel/providers/pop3/camel-pop3-store.c b/camel/providers/pop3/camel-pop3-store.c
index 3602534..333ed33 100644
--- a/camel/providers/pop3/camel-pop3-store.c
+++ b/camel/providers/pop3/camel-pop3-store.c
@@ -47,8 +47,6 @@
 /* defines the length of the server error message we can display in the error dialog */
 #define POP3_ERROR_SIZE_LIMIT 60
 
-static gpointer parent_class;
-
 static gboolean pop3_connect (CamelService *service, GError **error);
 static gboolean pop3_disconnect (CamelService *service, gboolean clean, GError **error);
 static GList *query_auth_types (CamelService *service, GError **error);
@@ -60,6 +58,8 @@ static CamelFolder *get_trash  (CamelStore *store, GError **error);
 
 static gboolean pop3_can_refresh_folder (CamelStore *store, CamelFolderInfo *info, GError **error);
 
+G_DEFINE_TYPE (CamelPOP3Store, camel_pop3_store, CAMEL_TYPE_STORE)
+
 static void
 pop3_store_finalize (GObject *object)
 {
@@ -76,18 +76,16 @@ pop3_store_finalize (GObject *object)
 		g_object_unref (pop3_store->cache);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_pop3_store_parent_class)->finalize (object);
 }
 
 static void
-pop3_store_class_init (CamelPOP3StoreClass *class)
+camel_pop3_store_class_init (CamelPOP3StoreClass *class)
 {
 	GObjectClass *object_class;
 	CamelServiceClass *service_class;
 	CamelStoreClass *store_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->finalize = pop3_store_finalize;
 
@@ -102,22 +100,9 @@ pop3_store_class_init (CamelPOP3StoreClass *class)
 	store_class->can_refresh_folder = pop3_can_refresh_folder;
 }
 
-GType
-camel_pop3_store_get_type (void)
+static void
+camel_pop3_store_init (CamelPOP3Store *pop3_store)
 {
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_STORE,
-			"CamelPOP3Store",
-			sizeof (CamelPOP3StoreClass),
-			(GClassInitFunc) pop3_store_class_init,
-			sizeof (CamelPOP3Store),
-			(GInstanceInitFunc) NULL,
-			0);
-
-	return type;
 }
 
 enum {
@@ -193,7 +178,7 @@ connect_to_server (CamelService *service,
 	}
 
 	/* parent class connect initialization */
-	if (CAMEL_SERVICE_CLASS (parent_class)->connect (service, error) == FALSE) {
+	if (CAMEL_SERVICE_CLASS (camel_pop3_store_parent_class)->connect (service, error) == FALSE) {
 		g_object_unref (tcp_stream);
 		return FALSE;
 	}
@@ -368,7 +353,7 @@ query_auth_types (CamelService *service,
 	GError *local_error = NULL;
 
 	/* Chain up to parent's query_auth_types() method. */
-	service_class = CAMEL_SERVICE_CLASS (parent_class);
+	service_class = CAMEL_SERVICE_CLASS (camel_pop3_store_parent_class);
 	types = service_class->query_auth_types (service, &local_error);
 
 	if (local_error != NULL) {
@@ -726,7 +711,7 @@ pop3_disconnect (CamelService *service,
 	}
 
 	/* Chain up to parent's disconnect() method. */
-	service_class = CAMEL_SERVICE_CLASS (parent_class);
+	service_class = CAMEL_SERVICE_CLASS (camel_pop3_store_parent_class);
 	if (!service_class->disconnect (service, clean, error))
 		return FALSE;
 
diff --git a/camel/providers/pop3/camel-pop3-stream.c b/camel/providers/pop3/camel-pop3-stream.c
index 780e651..bca4fdd 100644
--- a/camel/providers/pop3/camel-pop3-stream.c
+++ b/camel/providers/pop3/camel-pop3-stream.c
@@ -35,11 +35,11 @@
 
 #define dd(x) (camel_verbose_debug?(x):0)
 
-static gpointer parent_class;
-
 #define CAMEL_POP3_STREAM_SIZE (4096)
 #define CAMEL_POP3_STREAM_LINE (1024) /* maximum line size */
 
+G_DEFINE_TYPE (CamelPOP3Stream, camel_pop3_stream, CAMEL_TYPE_STREAM)
+
 static void
 pop3_stream_dispose (GObject *object)
 {
@@ -51,7 +51,7 @@ pop3_stream_dispose (GObject *object)
 	}
 
 	/* Chain up to parent's dispose() method. */
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	G_OBJECT_CLASS (camel_pop3_stream_parent_class)->dispose (object);
 }
 
 static void
@@ -63,7 +63,7 @@ pop3_stream_finalize (GObject *object)
 	g_free (stream->linebuf);
 
 	/* Chain up to parent's finalize() method. */
-	G_OBJECT_CLASS (parent_class)->finalize (object);
+	G_OBJECT_CLASS (camel_pop3_stream_parent_class)->finalize (object);
 }
 
 static gint
@@ -213,13 +213,11 @@ stream_reset (CamelStream *stream,
 }
 
 static void
-pop3_stream_class_init (CamelStreamClass *class)
+camel_pop3_stream_class_init (CamelPOP3StreamClass *class)
 {
 	GObjectClass *object_class;
 	CamelStreamClass *stream_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	object_class = G_OBJECT_CLASS (class);
 	object_class->dispose = pop3_stream_dispose;
 	object_class->finalize = pop3_stream_finalize;
@@ -234,7 +232,7 @@ pop3_stream_class_init (CamelStreamClass *class)
 }
 
 static void
-pop3_stream_init (CamelPOP3Stream *is)
+camel_pop3_stream_init (CamelPOP3Stream *is)
 {
 	/* +1 is room for appending a 0 if we need to for a line */
 	is->ptr = is->end = is->buf = g_malloc (CAMEL_POP3_STREAM_SIZE+1);
@@ -248,24 +246,6 @@ pop3_stream_init (CamelPOP3Stream *is)
 	is->mode = CAMEL_POP3_STREAM_LINE;
 }
 
-GType
-camel_pop3_stream_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_STREAM,
-			"CamelPOP3Stream",
-			sizeof (CamelPOP3StreamClass),
-			(GClassInitFunc) pop3_stream_class_init,
-			sizeof (CamelPOP3Stream),
-			(GInstanceInitFunc) pop3_stream_init,
-			0);
-
-	return type;
-}
-
 /**
  * camel_pop3_stream_new:
  *
diff --git a/camel/providers/sendmail/camel-sendmail-transport.c b/camel/providers/sendmail/camel-sendmail-transport.c
index 7760ef9..dbb082a 100644
--- a/camel/providers/sendmail/camel-sendmail-transport.c
+++ b/camel/providers/sendmail/camel-sendmail-transport.c
@@ -44,8 +44,10 @@ static gboolean sendmail_send_to (CamelTransport *transport,
 				  CamelAddress *from, CamelAddress *recipients,
 				  GError **error);
 
+G_DEFINE_TYPE (CamelSendmailTransport, camel_sendmail_transport, CAMEL_TYPE_TRANSPORT)
+
 static void
-sendmail_transport_class_init (CamelSendmailTransportClass *class)
+camel_sendmail_transport_class_init (CamelSendmailTransportClass *class)
 {
 	CamelServiceClass *service_class;
 	CamelTransportClass *transport_class;
@@ -57,22 +59,9 @@ sendmail_transport_class_init (CamelSendmailTransportClass *class)
 	transport_class->send_to = sendmail_send_to;
 }
 
-GType
-camel_sendmail_transport_get_type (void)
+static void
+camel_sendmail_transport_init (CamelSendmailTransport *sendmail_transport)
 {
-	static GType type = G_TYPE_INVALID;
-
-	if (type == G_TYPE_INVALID)
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_TRANSPORT,
-			"CamelSendmailTransport",
-			sizeof (CamelSendmailTransportClass),
-			(GClassInitFunc) sendmail_transport_class_init,
-			sizeof (CamelSendmailTransport),
-			(GInstanceInitFunc) NULL,
-			0);
-
-	return type;
 }
 
 static gboolean
diff --git a/camel/providers/smtp/camel-smtp-transport.c b/camel/providers/smtp/camel-smtp-transport.c
index 413b171..d824651 100644
--- a/camel/providers/smtp/camel-smtp-transport.c
+++ b/camel/providers/smtp/camel-smtp-transport.c
@@ -70,16 +70,14 @@ static gboolean smtp_quit (CamelSmtpTransport *transport, GError **error);
 static void smtp_set_exception (CamelSmtpTransport *transport, gboolean disconnect, const gchar *respbuf,
 				const gchar *message, GError **error);
 
-static gpointer parent_class;
+G_DEFINE_TYPE (CamelSmtpTransport, camel_smtp_transport, CAMEL_TYPE_TRANSPORT)
 
 static void
-smtp_transport_class_init (CamelSmtpTransportClass *class)
+camel_smtp_transport_class_init (CamelSmtpTransportClass *class)
 {
 	CamelTransportClass *transport_class;
 	CamelServiceClass *service_class;
 
-	parent_class = g_type_class_peek_parent (class);
-
 	service_class = CAMEL_SERVICE_CLASS (class);
 	service_class->connect = smtp_connect;
 	service_class->disconnect = smtp_disconnect;
@@ -91,30 +89,12 @@ smtp_transport_class_init (CamelSmtpTransportClass *class)
 }
 
 static void
-smtp_transport_init (CamelSmtpTransport *smtp)
+camel_smtp_transport_init (CamelSmtpTransport *smtp)
 {
 	smtp->flags = 0;
 	smtp->connected = FALSE;
 }
 
-GType
-camel_smtp_transport_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_TRANSPORT,
-			"CamelSmtpTransport",
-			sizeof (CamelSmtpTransportClass),
-			(GClassInitFunc) smtp_transport_class_init,
-			sizeof (CamelSmtpTransport),
-			(GInstanceInitFunc) smtp_transport_init,
-			0);
-
-	return type;
-}
-
 static const gchar *
 smtp_error_string (gint error)
 {
@@ -206,7 +186,7 @@ connect_to_server (CamelService *service,
 	gchar *respbuf = NULL;
 	gint ret;
 
-	if (!CAMEL_SERVICE_CLASS (parent_class)->connect (service, error))
+	if (!CAMEL_SERVICE_CLASS (camel_smtp_transport_parent_class)->connect (service, error))
 		return FALSE;
 
 	/* set some smtp transport defaults */
@@ -592,7 +572,7 @@ smtp_disconnect (CamelService *service,
 	}
 
 	/* Chain up to parent's disconnect() method. */
-	service_class = CAMEL_SERVICE_CLASS (parent_class);
+	service_class = CAMEL_SERVICE_CLASS (camel_smtp_transport_parent_class);
 	if (!service_class->disconnect (service, clean, error))
 		return FALSE;
 
diff --git a/camel/tests/lib/session.c b/camel/tests/lib/session.c
index 1a87069..b155069 100644
--- a/camel/tests/lib/session.c
+++ b/camel/tests/lib/session.c
@@ -4,22 +4,16 @@
 
 #include "session.h"
 
-GType
-camel_test_session_get_type (void)
-{
-	static GType type = G_TYPE_INVALID;
+G_DEFINE_TYPE (CamelTestSession, camel_test_session, CAMEL_TYPE_SESSION)
 
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			CAMEL_TYPE_SESSION,
-			"CamelTestSession",
-			sizeof (CamelTestSessionClass),
-			(GClassInitFunc) NULL,
-			sizeof (CamelTestSession),
-			(GInstanceInitFunc) NULL,
-			0);
+static void
+camel_test_session_class_init (CamelTestSessionClass *class)
+{
+}
 
-	return type;
+static void
+camel_test_session_init (CamelTestSession *test_session)
+{
 }
 
 CamelSession *
diff --git a/camel/tests/smime/pgp.c b/camel/tests/smime/pgp.c
index 7fa4fc6..a5f07c3 100644
--- a/camel/tests/smime/pgp.c
+++ b/camel/tests/smime/pgp.c
@@ -54,37 +54,20 @@ static gchar *get_password (CamelSession *session, const gchar *prompt,
 			   CamelService *service, const gchar *item,
 			   GError **error);
 
-static void
-init (CamelPgpSession *session)
-{
-	;
-}
+G_DEFINE_TYPE (CamelPgpSession, camel_pgp_session, camel_test_session_get_type ())
 
 static void
-class_init (CamelPgpSessionClass *camel_pgp_session_class)
+camel_pgp_session_class_init (CamelPgpSessionClass *class)
 {
-	CamelSessionClass *camel_session_class =
-		CAMEL_SESSION_CLASS (camel_pgp_session_class);
+	CamelSessionClass *session_class;
 
+	session_class = CAMEL_SESSION_CLASS (class);
 	camel_session_class->get_password = get_password;
 }
 
-static GType
-camel_pgp_session_get_type (void)
+static void
+camel_pgp_session_init (CamelPgpSession *session)
 {
-	static GType type = G_TYPE_INVALID;
-
-	if (G_UNLIKELY (type == G_TYPE_INVALID))
-		type = g_type_register_static_simple (
-			camel_test_session_get_type (),
-			"CamelPgpSession",
-			sizeof (CamelPgpSessionClass),
-			(GClassInitFunc) class_init,
-			sizeof (CamelPgpSession),
-			(GInstanceInitFunc) init,
-			0);
-
-	return type;
 }
 
 static gchar *



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]