diff --git a/libpurple/protocols/gg/gg.h b/libpurple/protocols/gg/gg.h
--- a/libpurple/protocols/gg/gg.h
+++ b/libpurple/protocols/gg/gg.h
@@ -42,22 +42,8 @@
 #include "message-prpl.h"
 #include "edisc.h"
 
-#define GGP_TYPE_PROTOCOL             (ggp_protocol_get_type())
-#define GGP_PROTOCOL(obj)             (G_TYPE_CHECK_INSTANCE_CAST((obj), GGP_TYPE_PROTOCOL, GGPProtocol))
-#define GGP_PROTOCOL_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST((klass), GGP_TYPE_PROTOCOL, GGPProtocolClass))
-#define GGP_IS_PROTOCOL(obj)          (G_TYPE_CHECK_INSTANCE_TYPE((obj), GGP_TYPE_PROTOCOL))
-#define GGP_IS_PROTOCOL_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE((klass), GGP_TYPE_PROTOCOL))
-#define GGP_PROTOCOL_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS((obj), GGP_TYPE_PROTOCOL, GGPProtocolClass))
-
-typedef struct
-{
-	PurpleProtocol parent;
-} GGPProtocol;
-
-typedef struct
-{
-	PurpleProtocolClass parent_class;
-} GGPProtocolClass;
+#define GGP_TYPE_PROTOCOL (ggp_protocol_get_type())
+G_DECLARE_FINAL_TYPE(GGPProtocol, ggp_protocol, GGP, PROTOCOL, PurpleProtocol)
 
 typedef struct {
 	struct gg_session *session;
diff --git a/libpurple/protocols/gg/gg.c b/libpurple/protocols/gg/gg.c
--- a/libpurple/protocols/gg/gg.c
+++ b/libpurple/protocols/gg/gg.c
@@ -47,6 +47,10 @@
 #include "html.h"
 #include "libgaduw.h"
 
+struct _GGPProtocol {
+	PurpleProtocol parent;
+};
+
 /* ---------------------------------------------------------------------- */
 static PurpleProtocol *my_protocol = NULL;
 
diff --git a/libpurple/protocols/novell/novell.h b/libpurple/protocols/novell/novell.h
--- a/libpurple/protocols/novell/novell.h
+++ b/libpurple/protocols/novell/novell.h
@@ -23,30 +23,10 @@
 #ifndef PURPLE_NOVELL_NOVELL_H
 #define PURPLE_NOVELL_NOVELL_H
 
-#include <gmodule.h>
-
 #include <purple.h>
 
-#define NOVELL_TYPE_PROTOCOL             (novell_protocol_get_type())
-#define NOVELL_PROTOCOL(obj)             (G_TYPE_CHECK_INSTANCE_CAST((obj), NOVELL_TYPE_PROTOCOL, NovellProtocol))
-#define NOVELL_PROTOCOL_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST((klass), NOVELL_TYPE_PROTOCOL, NovellProtocolClass))
-#define NOVELL_IS_PROTOCOL(obj)          (G_TYPE_CHECK_INSTANCE_TYPE((obj), NOVELL_TYPE_PROTOCOL))
-#define NOVELL_IS_PROTOCOL_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE((klass), NOVELL_TYPE_PROTOCOL))
-#define NOVELL_PROTOCOL_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS((obj), NOVELL_TYPE_PROTOCOL, NovellProtocolClass))
-
-typedef struct
-{
-	PurpleProtocol parent;
-} NovellProtocol;
-
-typedef struct
-{
-	PurpleProtocolClass parent_class;
-} NovellProtocolClass;
-
-/**
- * Returns the GType for the NovellProtocol object.
- */
-G_MODULE_EXPORT GType novell_protocol_get_type(void);
+#define NOVELL_TYPE_PROTOCOL (novell_protocol_get_type())
+G_DECLARE_FINAL_TYPE(NovellProtocol, novell_protocol, NOVELL, PROTOCOL,
+                     PurpleProtocol)
 
 #endif /* PURPLE_NOVELL_NOVELL_H */
diff --git a/libpurple/protocols/novell/novell.c b/libpurple/protocols/novell/novell.c
--- a/libpurple/protocols/novell/novell.c
+++ b/libpurple/protocols/novell/novell.c
@@ -40,6 +40,10 @@
 #define NOVELL_STATUS_TYPE_IDLE "idle"
 #define NOVELL_STATUS_TYPE_APPEAR_OFFLINE "appearoffline"
 
+struct _NovellProtocol {
+	PurpleProtocol parent;
+};
+
 static PurpleProtocol *my_protocol = NULL;
 
 static gboolean
diff --git a/libpurple/protocols/null/nullprpl.h b/libpurple/protocols/null/nullprpl.h
--- a/libpurple/protocols/null/nullprpl.h
+++ b/libpurple/protocols/null/nullprpl.h
@@ -26,26 +26,8 @@
 
 #include <purple.h>
 
-#define NULL_TYPE_PROTOCOL             (null_protocol_get_type())
-#define NULL_PROTOCOL(obj)             (G_TYPE_CHECK_INSTANCE_CAST((obj), NULL_TYPE_PROTOCOL, NullProtocol))
-#define NULL_PROTOCOL_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST((klass), NULL_TYPE_PROTOCOL, NullProtocolClass))
-#define NULL_IS_PROTOCOL(obj)          (G_TYPE_CHECK_INSTANCE_TYPE((obj), NULL_TYPE_PROTOCOL))
-#define NULL_IS_PROTOCOL_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE((klass), NULL_TYPE_PROTOCOL))
-#define NULL_PROTOCOL_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS((obj), NULL_TYPE_PROTOCOL, NullProtocolClass))
-
-typedef struct
-{
-	PurpleProtocol parent;
-} NullProtocol;
-
-typedef struct
-{
-	PurpleProtocolClass parent_class;
-} NullProtocolClass;
-
-/**
- * Returns the GType for the NullProtocol object.
- */
-G_MODULE_EXPORT GType null_protocol_get_type(void);
+#define NULL_TYPE_PROTOCOL (null_protocol_get_type())
+G_DECLARE_FINAL_TYPE(NullProtocol, null_protocol, NULL, PROTOCOL,
+                     PurpleProtocol)
 
 #endif /* PURPLE_NULL_NULLPRPL_H */
diff --git a/libpurple/protocols/null/nullprpl.c b/libpurple/protocols/null/nullprpl.c
--- a/libpurple/protocols/null/nullprpl.c
+++ b/libpurple/protocols/null/nullprpl.c
@@ -51,6 +51,10 @@
 
 #include "nullprpl.h"
 
+struct _NullProtocol {
+	PurpleProtocol parent;
+};
+
 /*
  * reference to the protocol instance, used for registering signals, prefs,
  * etc. it is set when the protocol is added in plugin_load and is required
diff --git a/libpurple/protocols/sametime/sametime.h b/libpurple/protocols/sametime/sametime.h
--- a/libpurple/protocols/sametime/sametime.h
+++ b/libpurple/protocols/sametime/sametime.h
@@ -1,14 +1,8 @@
 #ifndef PURPLE_SAMETIME_SAMETIME_H
 #define PURPLE_SAMETIME_SAMETIME_H
 
-#include <gmodule.h>
-
-#define MW_TYPE_PROTOCOL             (mw_protocol_get_type())
-#define MW_PROTOCOL(obj)             (G_TYPE_CHECK_INSTANCE_CAST((obj), MW_TYPE_PROTOCOL, mwProtocol))
-#define MW_PROTOCOL_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST((klass), MW_TYPE_PROTOCOL, mwProtocolClass))
-#define MW_IS_PROTOCOL(obj)          (G_TYPE_CHECK_INSTANCE_TYPE((obj), MW_TYPE_PROTOCOL))
-#define MW_IS_PROTOCOL_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE((klass), MW_TYPE_PROTOCOL))
-#define MW_PROTOCOL_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS((obj), MW_TYPE_PROTOCOL, mwProtocolClass))
+#define MW_TYPE_PROTOCOL (mw_protocol_get_type())
+G_DECLARE_FINAL_TYPE(mwProtocol, mw_protocol, MW, PROTOCOL, PurpleProtocol)
 
 /* CFLAGS trumps configure values */
 
@@ -35,21 +29,4 @@
 #endif
 /* ISO-8859-1 */
 
-
-typedef struct
-{
-	PurpleProtocol parent;
-} mwProtocol;
-
-typedef struct
-{
-	PurpleProtocolClass parent_class;
-} mwProtocolClass;
-
-
-/**
- * Returns the GType for the mwProtocol object.
- */
-G_MODULE_EXPORT GType mw_protocol_get_type(void);
-
 #endif /* PURPLE_SAMETIME_SAMETIME_H */
diff --git a/libpurple/protocols/sametime/sametime.c b/libpurple/protocols/sametime/sametime.c
--- a/libpurple/protocols/sametime/sametime.c
+++ b/libpurple/protocols/sametime/sametime.c
@@ -57,6 +57,9 @@
 #include "sametime.h"
 #include "im_mime.h"
 
+struct _mwProtocol {
+	PurpleProtocol parent;
+};
 
 static PurpleProtocol *my_protocol = NULL;
 
diff --git a/libpurple/protocols/silc/silc.c b/libpurple/protocols/silc/silc.c
--- a/libpurple/protocols/silc/silc.c
+++ b/libpurple/protocols/silc/silc.c
@@ -24,6 +24,10 @@
 #include "ft.h"
 #include "wb.h"
 
+struct _SilcProtocol {
+	PurpleProtocol parent;
+};
+
 extern SilcClientOperations ops;
 
 static PurpleProtocol *my_protocol = NULL;
diff --git a/libpurple/protocols/silc/silcpurple.h b/libpurple/protocols/silc/silcpurple.h
--- a/libpurple/protocols/silc/silcpurple.h
+++ b/libpurple/protocols/silc/silcpurple.h
@@ -20,20 +20,15 @@
 #ifndef PURPLE_SILC_SILCPURPLE_H
 #define PURPLE_SILC_SILCPURPLE_H
 
-#include <gmodule.h>
-
 #include <silc.h>
 #include <silcclient.h>
 
 /* Purple includes */
 #include <purple.h>
 
-#define SILCPURPLE_TYPE_PROTOCOL             (silcpurple_protocol_get_type())
-#define SILCPURPLE_PROTOCOL(obj)             (G_TYPE_CHECK_INSTANCE_CAST((obj), SILCPURPLE_TYPE_PROTOCOL, SilcProtocol))
-#define SILCPURPLE_PROTOCOL_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST((klass), SILCPURPLE_TYPE_PROTOCOL, SilcProtocolClass))
-#define SILCPURPLE_IS_PROTOCOL(obj)          (G_TYPE_CHECK_INSTANCE_TYPE((obj), SILCPURPLE_TYPE_PROTOCOL))
-#define SILCPURPLE_IS_PROTOCOL_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE((klass), SILCPURPLE_TYPE_PROTOCOL))
-#define SILCPURPLE_PROTOCOL_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS((obj), SILCPURPLE_TYPE_PROTOCOL, SilcProtocolClass))
+#define SILCPURPLE_TYPE_PROTOCOL (silcpurple_protocol_get_type())
+G_DECLARE_FINAL_TYPE(SilcProtocol, silcpurple_protocol, SILC, PROTOCOL,
+                     PurpleProtocol)
 
 /* Default public and private key file names */
 #define SILCPURPLE_PUBLIC_KEY_NAME "public_key.pub"
@@ -54,16 +49,6 @@
 #define SILCPURPLE_STATUS_ID_INDISPOSED "indisposed"
 #define SILCPURPLE_STATUS_ID_PAGE		"page"
 
-typedef struct
-{
-	PurpleProtocol parent;
-} SilcProtocol;
-
-typedef struct
-{
-	PurpleProtocolClass parent_class;
-} SilcProtocolClass;
-
 typedef struct {
 	unsigned long id;
 	const char *channel;
@@ -99,9 +84,6 @@
 	unsigned int chpk                 : 1;
 } *SilcPurple;
 
-
-G_MODULE_EXPORT GType silcpurple_protocol_get_type(void);
-
 void silc_say(SilcClient client, SilcClientConnection conn,
 	      SilcClientMessageType type, char *msg, ...);
 SilcBool silcpurple_command_reply(SilcClient client, SilcClientConnection conn,
diff --git a/libpurple/protocols/zephyr/zephyr.h b/libpurple/protocols/zephyr/zephyr.h
--- a/libpurple/protocols/zephyr/zephyr.h
+++ b/libpurple/protocols/zephyr/zephyr.h
@@ -23,30 +23,10 @@
 #ifndef PURPLE_ZEPHYR_ZEPHYR_H
 #define PURPLE_ZEPHYR_ZEPHYR_H
 
-#include <gmodule.h>
-
 #include <purple.h>
 
-#define ZEPHYR_TYPE_PROTOCOL             (zephyr_protocol_get_type())
-#define ZEPHYR_PROTOCOL(obj)             (G_TYPE_CHECK_INSTANCE_CAST((obj), ZEPHYR_TYPE_PROTOCOL, ZephyrProtocol))
-#define ZEPHYR_PROTOCOL_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST((klass), ZEPHYR_TYPE_PROTOCOL, ZephyrProtocolClass))
-#define ZEPHYR_IS_PROTOCOL(obj)          (G_TYPE_CHECK_INSTANCE_TYPE((obj), ZEPHYR_TYPE_PROTOCOL))
-#define ZEPHYR_IS_PROTOCOL_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE((klass), ZEPHYR_TYPE_PROTOCOL))
-#define ZEPHYR_PROTOCOL_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS((obj), ZEPHYR_TYPE_PROTOCOL, ZephyrProtocolClass))
-
-typedef struct
-{
-	PurpleProtocol parent;
-} ZephyrProtocol;
-
-typedef struct
-{
-	PurpleProtocolClass parent_class;
-} ZephyrProtocolClass;
-
-/**
- * Returns the GType for the ZephyrProtocol object.
- */
-G_MODULE_EXPORT GType zephyr_protocol_get_type(void);
+#define ZEPHYR_TYPE_PROTOCOL (zephyr_protocol_get_type())
+G_DECLARE_FINAL_TYPE(ZephyrProtocol, zephyr_protocol, ZEPHYR, PROTOCOL,
+                     PurpleProtocol)
 
 #endif /* PURPLE_ZEPHYR_ZEPHYR_H */
diff --git a/libpurple/protocols/zephyr/zephyr.c b/libpurple/protocols/zephyr/zephyr.c
--- a/libpurple/protocols/zephyr/zephyr.c
+++ b/libpurple/protocols/zephyr/zephyr.c
@@ -60,6 +60,10 @@
 
 typedef gboolean (*ZephyrLoginFunc)(zephyr_account *zephyr);
 
+struct _ZephyrProtocol {
+	PurpleProtocol parent;
+};
+
 struct _zephyr_triple {
 	ZSubscription_t sub;
 	char *name;
