diff --git a/lib/type_id/ecto.ex b/lib/type_id/ecto.ex
index 4137fe2..2da4736 100644
--- a/lib/type_id/ecto.ex
+++ b/lib/type_id/ecto.ex
@@ -95,22 +95,43 @@ if Code.ensure_loaded?(Ecto.ParameterizedType) do
 
     def load(_, _, _), do: :error
 
+    defp validate_type!(type) do
+      unless type in ~w[string uuid]a do
+        raise ArgumentError, "`type` must be `:string` or `:uuid`"
+      end
+
+      type
+    end
+
+    defp get_type(opts) do
+      default_type = Application.get_env(:typeid_elixir, :default_type, :string)
+
+      case Keyword.get(opts, :column_type) do
+        nil ->
+          opts
+          |> Keyword.get(:type, default_type)
+          |> case do
+            TypeID -> default_type
+            type -> type
+          end
+          |> validate_type!()
+
+        type ->
+          validate_type!(type)
+      end
+    end
+
     defp validate_opts!(opts) do
       primary_key = Keyword.get(opts, :primary_key, false)
       schema = Keyword.fetch!(opts, :schema)
       field = Keyword.fetch!(opts, :field)
-      default_type = Application.get_env(:typeid_elixir, :default_type, :string)
-      type = Keyword.get(opts, :type, default_type)
       prefix = Keyword.get(opts, :prefix)
+      type = get_type(opts)
 
       if primary_key do
         TypeID.validate_prefix!(prefix)
       end
 
-      unless type in ~w[string uuid]a do
-        raise ArgumentError, "`type` must be `:string` or `:uuid`"
-      end
-
       if primary_key do
         %{primary_key: primary_key, schema: schema, field: field, prefix: prefix, type: type}
       else